![](/img/trans.png)
[英]How to make a Main Thread waiting for the AsyncTask android, without blocking the UI
[英]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.