Я пытаюсь сделать тяжелый расчет чашки, а затем хочу обновить пользовательский интерфейс.
Ниже мой код:
private fun updateData() {
GlobalScope.launch(Dispatchers.Default){ //work on default thread
while (true){
response.forEach {
val out = doIntensiveWork()
withContext(Dispatchers.Main){ //update on main thread
_data.postValue(out)
delay(1500L)
}
}
}
}
}
этот способ использования сопрограмм в порядке? Так как запуск всей работы на Main тоже не имеет видимого эффекта и работает нормально.
private fun updateData() {
GlobalScope.launch(Dispatchers.Main){ //work on Main thread
while (true){
response.forEach {
val out = doIntensiveWork()
_data.postValue(out)
delay(1500L)
}
}
}
}
Какой из них рекомендуется?
Вам следует избегать использования GlobalScope
по причине, описанной здесь и здесь.
И вам следует рассмотреть возможность выполнения тяжелых вычислений вне основного потока
suspen fun doHeavyStuff(): Result = withContext(Dispatchers.IO) { // or Dispatchers.Default
// ...
}
suspend fun waitForHeavyStuf() = withContext(Dispatchers.Main) {
val result = doHeavyStuff() // runs on IO thread, but results comes back on Main thread
updateYourUI()
}
Документация