我对协同例程比较陌生,我正在尝试获取 Launch 协同例程将完成的行为:
launch(UI) {
val v1 = someDeferredType
val v2 = v1.await()
val v3 = v2.text
}
在上面的例子中,v3 将等待 v2 执行,然后在不阻塞主线程的情况下运行。虽然这很棒,但它在我的调用 Activity/fragment 中引入了延迟类型和协程逻辑。
我想让我的 Activity/Fragment 不受特定实现细节的影响,像这样:
fun getResponseString() : String {
launch(UI) {
val v1 = someDeferredType
val v2 = v1.await()
val v3 = v2.text
}
return v3 //This is the actual String which I need to be returned
}
这样我就可以像在 Activity 中调用常规函数一样调用 getResponseString()。
到目前为止,我遇到的唯一选择是使用 runBlocking 协同例程,但与启动不同,这会完全阻塞主线程。
也许我遗漏了一些东西,或者无法使用 Kotlin 中的协程来做这样的事情?
最佳答案
您不能从像 getResponseString
这样的常规函数返回异步操作的结果。常规函数没有这种在不阻塞调用它们的线程的情况下暂停执行的能力。这就是为什么Kotlin要引入一个“挂起函数”的概念,所以你可以这样写:
suspend fun getResponseString(): String {
val v1 = someDeferredType
val v2 = v1.await()
val v3 = v2.text
return v3
}
将 suspend
修饰符添加到所有异步函数(必须等待但不应阻塞 UI 线程的函数)然后使用 launch(UI) { .. .
仅在您需要启动一些自包含的异步操作的最顶层。
附言协程也拼写为“coroutines”。这是一个词,没有破折号。参见 wikipedia ,例如。
关于android - Kotlin Coroutines - 从 Coroutine 返回一个值而不阻塞主线程 Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51271242/