Изменить макет из сопрограммы

#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
    }
}