如何使用带有挂起API功能的Authenticator?改造

Nur*_*lov 6 android okhttp retrofit2 kotlin-coroutines

我正在构建客户端:

OkHttpClient().newBuilder()
        .authenticator(object : Authenticator {
        override fun authenticate(route: Route?, response: Response): Request? {
            val request = AppPreferences.refreshToken?.let {
                api.refreshTokenC(it).execute()
            }
            
         ...
        })
Run Code Online (Sandbox Code Playgroud)

为此,我使用通常的 fun 来返回 Call :

@POST("Accounts/refresh")
fun refreshTokenC(@Query("refreshToken") refreshToken: String): Call<TokenResponse>
Run Code Online (Sandbox Code Playgroud)

但是如何将它与挂起功能一起使用呢?:

    @POST("Accounts/refresh")
suspend fun refreshToken(@Query("refreshToken") refreshToken: String): Response<TokenResponse>
Run Code Online (Sandbox Code Playgroud)

Pet*_*Học 3

  • fun authenticate(route: Route?, response: Response)不是挂起函数,我们不能从中调用挂起函数。

  • 可以使用runBlocking

运行一个新的协程并中断地阻塞当前线程,直到其完成。不应在协程中使用此函数。它旨在将常规阻塞代码桥接到以挂起风格编写的库,以在主函数和测试中使用。

  • fun authenticate(route: Route?, response: Response)在后台线程上被调用,我们可以runBlocking安全地使用。
val request = AppPreferences.refreshToken?.let { token ->
    runBlocking { api.refreshToken(token) }
}
Run Code Online (Sandbox Code Playgroud)

类似代码:AuthInterceptor.kt