android - Kotlin Coroutines - 从 Coroutine 返回一个值而不阻塞主线程 Android

标签 android kotlin kotlin-coroutines

我对协同例程比较陌生,我正在尝试获取 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/

相关文章:

android - 如何同步协程?

Android Studio 4.1 : XML Resource ID auto Fetching issue

android - 以编程方式更改芯片小部件样式不起作用 - Android

firebase - 使用 StateFlow<Boolean> 时如何删除监听器?

android - 如何使用流协程创建倒计时

android - kotlin.coroutines.intrinsics.CoroutineSingletons 不能转换为 retrofit2.Response

android - 禁用键盘上的特定键

android - 如何在 Android 中获取像素颜色?

android - 真正简单的TCP客户端

android - 你如何防止 fragment webview 每次都重新加载?