Android Livedata Observer Coroutine Kotlin - PullRequest
0 голосов
/ 10 октября 2019

Можно ли в наблюдателе выполнять сопрограмму для обновления пользовательского интерфейса?

Например:

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

Ответы [ 2 ]

0 голосов
/ 10 октября 2019

Да, это возможно. Вы можете запустить сопрограмму GlobalScope, и когда вам нужно обновить пользовательский интерфейс, вы должны быть активны !!. RunOnUiThread

Вот пример.

viewModel.phoneNumber.observe(this, Observer { phoneNumber ->
        GlobalScope.launch {
            delay(1000L) //Wait a moment (1 Second)
            activity!!.runOnUiThread {
                binding.textviewPhoneLabel.edittextName.setText(phoneNumber)
            }
        }
    })
0 голосов
/ 10 октября 2019

Вы можете запустить любой код из обратного вызова 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'
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...