【问题标题】:how to use Authenticator with suspend api function? Retrofit如何使用 Authenticator 和挂起 api 功能?改造
【发布时间】:2021-05-08 09:08:24
【问题描述】:

我正在构建客户端:

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

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

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

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

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

【问题讨论】:

    标签: android retrofit2 okhttp kotlin-coroutines


    【解决方案1】:
    • 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

    【讨论】:

    • 这不是 kotlin 协程的好解决方案,您应该改为桥接异步 API。
    • authenticate 不是挂起功能
    • 如果你稍微修改你的帖子,我会改变我的投票。
    • Unconfined 范围怎么样?
    • @mochadwi 可以使用Unconfined
    猜你喜欢
    • 1970-01-01
    • 2020-02-27
    • 2021-10-31
    • 1970-01-01
    • 1970-01-01
    • 2020-05-19
    • 1970-01-01
    • 2020-03-13
    • 2020-02-22
    相关资源
    最近更新 更多