#android #kotlin #kotlin-coroutines #coroutine
#Android #kotlin #kotlin-сопрограммы #сопрограмма
Вопрос:
Запуск сопрограммы
GlobalScope.launch(){
get_message_pulling()
}
Мне нужно отредактировать макет из get_message_pulling()
, но я получаю ошибку
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.
Комментарии:
1. Использование
GlobalScope
не рекомендуется — kotlin.github.io/kotlinx.coroutines/kotlinx-coroutines-core /…
Ответ №1:
поскольку использование GlobalScope.launch()
без указания контекста сопрограммы приведет к запуску вашего кода в фоновом потоке с использованием Dispatchers.Default
, а не MainThread, вы можете взаимодействовать с пользовательским интерфейсом только через контекст сопрограммы MainThread
GlobalScope.launch(){
get_message_pulling()
withContext(Dispatchers.Main) {
// then update the UI
}
}
Ответ №2:
Решается
private fun get_message_pulling() {
runOnUiThread {
// ui changing code
}
}
Ответ №3:
Вы можете использовать Android, специфичный Dispatchers.Main
для выполнения обновлений пользовательского интерфейса. Кроме того, избегайте использования GlobalScope
для запуска сопрограмм, как описано здесь. Вместо этого выберите Dispatchers.Default
или Dispatchers.IO
.
// CPU bound - Dispatchers.Default
// IO bound - Dispatchers.IO
val defaultScope = CoroutineScope(Dispatchers.Default)
defaultScope.launch {
get_message_pulling()
withContext(Dispatchers.Main){
// Your UI updates
}
}