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()
    )
}