android - 如何使用 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>
解决方案
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
推荐阅读
- python - TypeError: field col1: LongType can't accept object '' in type
- java - 最小值和最大值
- django-models - “没有名为 'razorpay' 的模块”:Django restframework
- postgresql - Postgres n_tup_ins 与从未分析过的表的行数不匹配
- python - 如何在一个函数调用中按块加密和解密?
- kotlin - 使用 Jetpack Compose 导航
- flutter - 使用前一个小部件的索引值
- android - Android Gradle 读取风味文件
- string - AWS Cloudformation 属性 SubnetIds 的值必须是字符串列表类型
- python - 使用 pyinstaller 时无法加载本机模块“Crypto.Cipher._raw_ecb”