我对Co-Routines比较陌生,我正在尝试了解启动co-Routines将完成的行为:
launch(UI) {
val v1 = someDeferredType
val v2 = v1.await()
val v3 = v2.text
} 在上面的示例中,v3将等待v2执行,然后在不阻塞主线程的情况下运行。虽然这很棒,但它在我的调用活动/片段中引入了延迟类型和协同例程逻辑。
我想让我的活动/片段不受特定实现细节的影响,比如:
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
}这样我就可以像调用活动中的常规函数一样调用getResponseString()。
到目前为止,我遇到的唯一选择是使用runBlocking协同例程,但这与launch完全不同,它会阻塞主线程。
也许我错过了什么,或者是不可能在Kotlin中使用Co-routines来做这样的事情?
发布于 2018-07-12 15:14:12
不能从像getResponseString这样的常规函数返回异步操作的结果。常规函数不具备在不阻塞调用它们的线程的情况下挂起执行的功能。这就是为什么Kotlin必须引入“挂起函数”的概念,所以你可以这样写:
suspend fun getResponseString(): String {
val v1 = someDeferredType
val v2 = v1.await()
val v3 = v2.text
return v3
}将suspend修饰符添加到所有异步函数(必须等待某些东西但不应阻塞UI线程的函数),然后仅在需要启动某些自包含异步操作的最高层使用launch(UI) { ... }。
附注:协程也被拼写为“协程”。这是一个单词,没有破折号。例如,请参见wikipedia。
https://stackoverflow.com/questions/51271242
复制相似问题