繁体   English   中英

在不阻塞主线程的情况下等待协程结果

[英]Waiting for coroutine result without blocking main thread

我必须根据 .network 调用返回的数据更新片段中的项目。 我不想阻塞主线程并以 ANR 结束,所以我采用了“回调”的方法,但是我想知道是否有一种方法可以在不依赖使用协程的回调机制的情况下等待 .network 调用的结果

当前实施

我的片段.kt

fun updateButtonText() {
   handlerClass.getData {
      //received data from the server update the button text
   }
}

处理器类.kt

fun getData(callback: (String) -> Unit) {
   scope.launch(Dispatchers.IO) {
      val data = mySuspendedNetworkcallMethod()

      callback.invoke(data)
   }
}

期望的实现:

我的片段.kt

fun updateButtonText() {
   val data = handlerClass.getData()
   button.text = data
}

处理器类.kt

suspend fun getData() {
   return mySuspendedNetworkcallMethod()
}

据我所知,对于所需的演示实现,我必须使用 runBlocking{} 来调用挂起的方法,但是 runBlocking{} 将阻止调用线程 - 在这种情况下将是主线程,直到getData()返回数据。

我不想阻塞主线程,但仍然能够调用并等待挂起的方法来获取数据,然后更新按钮。

协程旨在摆脱回调。 您可以在Fragment class 中使用lifecycleScope来启动生命周期感知协程,它将如下所示:

我的片段.kt

fun updateButtonText() = lifecycleScope.launch {
   button.text = handlerClass.getData()
}

处理程序类.kt

suspend fun getData() {
   return mySuspendedNetworkcallMethod()
}

如果您使用MVVM方法,您应该考虑使用ViewModel及其viewModelScope扩展来启动协程。

对于LifecycleScope ,使用androidx.lifecycle:lifecycle-runtime-ktx:2.4.0或更高版本。

对于ViewModelScope ,使用androidx.lifecycle:lifecycle-viewmodel-ktx:2.4.0或更高版本。

推荐的方法是将 viewmodel 和 viewmodelscope 用于挂起函数。

但是在您的情况下,只需使用 lifecyclescope

    fun updateButtonText() {
       lifecycleScope.launch{
          val data = handlerClass.getData()
          button.text = data
       }
    }

https://developer.android.com/topic/libraries/architecture/coroutines

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM