android - 在 retrofit 认证器中使用协程

标签 android retrofit2 kotlinx.coroutines

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

目前我正在使用 runBlocking {...} 调用来等待异步本地/远程响应

例子:

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 的协程无法将同步代码转换为异步代码,它们只会让您已经异步的代码看起来像同步代码一样简单。已经有一个feature request在 OkHttp 中专门启用您要求的内容,但被拒绝了。原因是,从Java的角度来说,把API搞得一团糟,实现的复杂度也很高。

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

关于android - 在 retrofit 认证器中使用协程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54375195/

相关文章:

java - 如何在使用 retrofit 2 时显示旋转图标以获取异步 Restful 调用的响应

kotlin - 为什么这些协程没有给出预期的输出?

android - 在带有 ProGuard 的 Android Instrumentation 测试中使用 Kotlin 协程

android - 无法将 pdf.js 查看器用于本地文件 ://on Android, 适用于 iOS

java - 无法获取另一个类中的屏幕宽度和高度值

java - 将输入流写入文件 - 未找到文件

android - 使用改造 2 发送文件,文件名包含波斯字符

kotlin.UninitializedPropertyAccessException : lateinit property salesGST has not been initialized

android - 使用android相机捕获图像后的空指针

android - 单元测试作用域 View 模型的最佳方法