Android Livedata Observer 协程 Kotlin

标签 android kotlin android-architecture-components kotlin-coroutines

是否可以在观察者内部有一个协程来更新 UI?

例如:

Viewmodel.data.observer(this, Observer{ coroutinescope })

最佳答案

您可以从Observer 回调中运行您想要的任何代码。但是启动稍后更新 UI 的协程并不是一个好主意,因为当协程完成时,UI 可能会被破坏,这可能会导致抛出异常并使您的应用程序崩溃。

只需直接从 Observer 回调运行 UI 更新代码。

viewModel.data.observe(this, Observer {
    // Update the UI here directly
})

这样一来,当您更新 UI 时,您就知道它是 Activity 的,因为 LiveData 考虑了 this 的生命周期。

如果您想在回调的同时启动一些协程,最好在您的 viewModel 中使用 viewModelScope 执行此操作。

// This triggers the above code
data.value = "foo"

// Now also launch a network request with a coroutine
viewModelScope.launch { 
    val moreData = api.doNetworkRequest()
    // Set the result in another LiveData
    otherLiveData.value = moreData
}

请注意,您必须向 build.gradle 添加依赖才能使用 viewModelScope:

dependencies {
    implementation 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.1.0'
}

关于Android Livedata Observer 协程 Kotlin,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58326362/

相关文章:

java - Android 中的 Facebook 好友生日

android - Kotlin + MockIto + Android 插桩测试

android - 如何使用导航 Controller 组件设置不同的工具栏?

android - 刷新项目列表的 MutableLiveData

android - WebView : WebSettings. LayoutAlgorithm.TEXT_AUTOSIZING : Below Android 4. 4?

android - 是否有一些算法可以保存最佳路线 gps android

具有新数据绑定(bind)导入的 Android Studio 3.2.1 无法编译

android - "Place was called on a node which was placed already"

android - 将对象发送到另一个 fragment 后进行更改

java - Android - AsyncTask 上的 RuntimeException