是否可以在观察者内部有一个例程来更新UI?
例如:
Viewmodel.data.observer(this, Observer{ coroutinescope })
答案 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