首页 > 解决方案 > 如何使用 Authenticator 和挂起 api 功能?改造

问题描述

我正在建立客户:

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

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

@POST("Accounts/refresh")
fun refreshTokenC(@Query("refreshToken") refreshToken: String): Call<TokenResponse>

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

    @POST("Accounts/refresh")
suspend fun refreshToken(@Query("refreshToken") refreshToken: String): Response<TokenResponse>

标签: androidretrofit2okhttpkotlin-coroutines

解决方案


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

  • 可以使用runBlocking

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

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

类似代码:AuthInterceptor.kt


推荐阅读