Android Livedata观察员协程Kotlin

时间:2019-10-10 15:26:08

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

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

例如:

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

2 个答案:

答案 0 :(得分:0)

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

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

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

这样一来,您就知道在更新UI时该UI仍然有效,因为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'
}

答案 1 :(得分:0)

是的,有可能。您可以启动GlobalScope协程,并且当需要更新UI时,应该处于活动状态!! runOnUiThread

这里有一个样本。

localhost