在改造身份验证器中使用协程

时间:2019-01-26 02:31:55

标签: android retrofit2 kotlinx.coroutines

我正在尝试使用协同程序实现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){...}
}

我应该怎么做?

1 个答案:

答案 0 :(得分:2)

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

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