Изменить макет из Coroutine

Запуск сопрограммы

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.

person LOVE USA    schedule 06.09.2020    source источник
comment
Использование GlobalScope не рекомендуется - kotlin. github.io/kotlinx.coroutines/kotlinx-coroutines-core/   -  person Siddharth Kamaria    schedule 08.09.2020


Ответы (3)


поскольку использование GlobalScope.launch() без указания контекста сопрограммы приведет к запуску вашего кода в фоновом потоке с использованием Dispatchers.Default, а не MainThread, вы можете общаться с пользовательским интерфейсом только через контекст сопрограммы MainThread

GlobalScope.launch(){
   get_message_pulling()

    withContext(Dispatchers.Main) {
       // then update the UI 
    }
}
person tamtom    schedule 06.09.2020

Решено

private fun get_message_pulling() {

runOnUiThread {
 // ui changing code
}
}
person LOVE USA    schedule 08.09.2020

Для обновления пользовательского интерфейса можно использовать Dispatchers.Main, специфичный для Android. Также избегайте использования 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
    }
}
person Siddharth Kamaria    schedule 08.09.2020