Вы можете запустить любой код из обратного вызова Observer
. Но было бы нецелесообразно запускать сопрограмму, которая позже обновляет пользовательский интерфейс, потому что, когда сопрограмма завершена, пользовательский интерфейс может быть уничтожен, что может привести к возникновению исключений и аварийному завершению работы вашего приложения.
ПростоЗапустите код обновления пользовательского интерфейса непосредственно из обратного вызова Observer
.
viewModel.data.observe(this, Observer {
// Update the UI here directly
})
Таким образом, вы узнаете, что пользовательский интерфейс активен при его обновлении, поскольку 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'
}