在改装认证器中使用协程

Using coroutines in retrofit authenticator

我正在尝试使用协程在改造中实现 JWT 令牌身份验证和刷新令牌。令牌存储在 Room 数据库中。我应该如何实现等待调用?

目前我正在使用 runBlocking {...} 调用来等待异步 local/remote 响应

示例:

client.addInterceptor {
        val accessToken = runBlocking { tokenRepository.getActiveToken() }?.access_token ?: "-"
        val request = it.request()
            .newBuilder()
            .addHeader("Authorization", "Bearer $accessToken")
            .build()
        return@addInterceptor it.proceed(request)
    }

我想遵循的传统模式是:

launch {
    withContext(IO){...}
}

我该怎么办?

OkHttp 是一个 Java 库并使用同步请求拦截器。 Kotlin 的协程无法将同步代码转换为异步代码,它们只会让您已经异步的代码看起来像同步代码一样简单。 OkHttp 中已经有一个 feature request 可以专门启用您的要求,但被拒绝了。原因是,从Java的角度来看,把API搞得一团糟,实现复杂度也很高。

他们的建议是在 OkHttp 之外处理这个问题,因此在您的情况下,首先以异步方式获取令牌,然后发起 HTTP 请求。

我希望这对以后看到的人有所帮助。您可以使用 runBlocking{ } 运行 身份验证器中的异步代码,这是专门设计用于将常规阻塞代码桥接到以挂起样式编写的库。