Я пытаюсь kotlinx.coroutines (версия: 1.2.0).Вот простой блок тестового кода:
GlobalScope.launch {
Logger.i("${Thread.currentThread()}, ${Looper.myLooper() == Looper.getMainLooper()}")
text_view.text = "test"
}
Печатный журнал:
Thread[DefaultDispatcher-worker-2,5,main], false
Как показывает журнал, мы не находимся в главном потоке Android, то есть в потоке пользовательского интерфейса.Однако приведенный выше код не будет генерировать исключение после того, как мы установим для этого рабочего потока текст text_view
, а для параметра "test" будет правильно установлено значение text_view
.В чем причина?
Обновление 1:
Добавление delay(10000L)
перед setText()
вызовет исключение при более коротком времени (например, 1000L в моем тесте для отладочного прогона)с холодным запуском) не будет.Так что похоже на проблему с Android.Но все же этот вопрос, в чем причина?
Обновление 2:
Теперь я понял, что это поведение связано с Android, а не с kotlinx.coroutines.Код выше выполняется в onCreate()
, когда ViewRootImpl
может не вызвать performTraversals()
или инициализировать все View
s.В этой ситуации, checkThread()
до операции пользовательского интерфейса также не вызывается.