我正在尝试使用协同程序实现JWT令牌身份验证并在翻新中刷新令牌。令牌存储在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){...}
}
我应该怎么做?
答案 0 :(得分:2)
OkHttp是Java库,并使用同步请求拦截器。 Kotlin的协程不能将同步代码转换为异步代码,它们只是使您已经异步的代码看起来像同步代码一样简单。 OkHttp中已经有一个feature request来专门启用您要求的功能,但是被拒绝了。原因是,从Java的角度来看,它使API一团糟,实现复杂性也很高。
他们的建议是在OkHttp外部处理此问题,因此,在您的情况下,首先以异步方式获取令牌,然后启动HTTP请求。