首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Kotlin Co-Routines --在不阻塞主线程的情况下从Co-Routines返回一个值

Kotlin Co-Routines --在不阻塞主线程的情况下从Co-Routines返回一个值
EN

Stack Overflow用户
提问于 2018-07-11 01:38:03
回答 1查看 2.7K关注 0票数 2

我对Co-Routines比较陌生,我正在尝试了解启动co-Routines将完成的行为:

代码语言:javascript
复制
launch(UI) { 

     val v1 = someDeferredType 
     val v2 = v1.await()
     val v3 = v2.text

} 

在上面的示例中,v3将等待v2执行,然后在不阻塞主线程的情况下运行。虽然这很棒,但它在我的调用活动/片段中引入了延迟类型和协同例程逻辑。

我想让我的活动/片段不受特定实现细节的影响,比如:

代码语言:javascript
复制
 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来做这样的事情?

EN

回答 1

Stack Overflow用户

发布于 2018-07-12 15:14:12

不能从像getResponseString这样的常规函数返回异步操作的结果。常规函数不具备在不阻塞调用它们的线程的情况下挂起执行的功能。这就是为什么Kotlin必须引入“挂起函数”的概念,所以你可以这样写:

代码语言:javascript
复制
suspend fun getResponseString(): String {
    val v1 = someDeferredType 
    val v2 = v1.await()
    val v3 = v2.text
    return v3
}

suspend修饰符添加到所有异步函数(必须等待某些东西但不应阻塞UI线程的函数),然后仅在需要启动某些自包含异步操作的最高层使用launch(UI) { ... }

附注:协程也被拼写为“协程”。这是一个单词,没有破折号。例如,请参见wikipedia

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51271242

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档