我正在尝试使用协程在改造中实现 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/