Android 在普通函数中调用挂起函数
我想在普通函数中调用阻止挂起函数,但不阻止线程完成挂起函数,然后返回Android 在普通函数中调用挂起函数,android,kotlin,coroutine,suspend,kotlin-coroutines,Android,Kotlin,Coroutine,Suspend,Kotlin Coroutines,我想在普通函数中调用阻止挂起函数,但不阻止线程完成挂起函数,然后返回Response override fun intercept(chain: Interceptor.Chain): Response { // getSession is a suspend function val session = sessionProvider.getSession() return chain.proceed( chain .requ
Response
override fun intercept(chain: Interceptor.Chain): Response {
// getSession is a suspend function
val session = sessionProvider.getSession()
return chain.proceed(
chain
.request()
.newBuilder()
.addHeader("Authorization", "${session.token}")
.build()
)
}
看起来您正在实现一个OkHttp拦截器,所以我希望在后台线程上调用
intercept()
如果是的话:
runBlocking()
将执行suspend
函数,阻塞当前线程,直到该工作完成。如果要从函数返回值,则需要阻塞线程。如果您不想阻止,则需要使用回调函数。这会导致问题,因为返回将被延迟,并且拦截函数未标记为挂起函数吗?@3366784:runBlocking()
本身不是一个suspend
函数,因此从编译的角度来看,一切都应该正常。这在运行时的效果很大程度上取决于sessionProvider.getSession()
的性能。如果这需要很长时间,那么每个OkHttp请求都需要很长时间,因为runBlocking()
调用是一个阻塞调用,intercept()
在runBlocking()
完成之前不会继续。好的,我知道这取决于.getSession()
。我很困惑,因为我知道如果返回值为的常规函数需要超过x秒的时间才能返回,有些语言会杀死你的应用程序。但在这种情况下,我们不得不推迟返回,正如你所说,这是可以的。我对此进行了测试,并添加了额外的延迟,它没有阻塞UI线程,也没有崩溃,因此应该是好的。
override fun intercept(chain: Interceptor.Chain): Response {
// getSession is a suspend function
val session = runBlocking { sessionProvider.getSession() }
return chain.proceed(
chain
.request()
.newBuilder()
.addHeader("Authorization", "${session.token}")
.build()
)
}