отношения kotlin coroutine и основного обработчика

У меня есть следующий фрагмент

verticalLayout { gravity = Gravity.CENTER button("BUTTON").onClick { trace("click on process") runBlocking { trace("blocking start") // #1 delay(20000L) #2 trace("blocking end") // #3 } trace("click process end") } } 

trace – это функция, определенная как служебная функция для вывода сообщений с использованием Log.e с текущим именем потока

когда я нажимаю кнопку, весь код работает так, как ожидалось, и журналы показывают, что все функции трассировки вызывается в журнале основного потока для # 3, появляется после # 1 в течение 20000L мс и не отображается ANR Dialog

но странные вещи произошли во время 20000L мс, кнопка удерживает нажатое состояние, даже когда я отпускаю кнопку сразу после щелчка, тогда я понял, что нажатое состояние восстанавливается, когда заканчивается метод onClick,

у меня была своя концепция, что coroutine – это магия компилятора, использующая CPS, чтобы преобразовать код в функцию стиля обратного вызова, например, следовать

 delay(20000L,callback = { trace("blocking end ")}) 

поэтому у меня есть следующие вопросы

  1. в конце концов, кто и когда на самом деле вызывает обратный вызов (например, трассировка («блокирующий конец»)), если ответ является основным петлером или чем-то (для nodejs, возможно, eventloop), нужно ли адаптировать структуру для сопрограммы и позволить событие coroutine put в очередь?
  2. говоря, что coroutine на самом деле является манерой компилятора, можем ли мы написать тот же код, что и фрагмент выше, который не вызывает ANR, но сохраняет нажатое состояние для 20000L?

Вы используете runBlocking который назван таким образом, потому что он блокирует поток, на который он вызывается, на время выполнения сопрограммы. В вашем конкретном случае вы блокируете поток пользовательского интерфейса с помощью runBlocking .

Вы можете заменить runBlocking на launch(UI) чтобы запустить фоновый сопрограмму в потоке пользовательского интерфейса без блокировки потока пользовательского интерфейса. Вы можете узнать больше о различных способах работы с сопрограммами в Руководстве по kotlinx.coroutines и в Руководстве по программированию пользовательского интерфейса с сопрограммами .

Intereting Posts
Генераторы Kotlin: использование интерфейса для MVP Продукт AndroidFlavors в gradle-kotlin-dsl Передача списка объектов в фрагмент Объявление байта в Kotlin делает ошибку времени компиляции «Целочисленный литерал не соответствует ожидаемому типу Byte» Мне просто не кажется, что мой Kotlin Recycler Multiple View Code разобрался Как создать обработчик Generic Response для ошибки и проверки ответа с помощью модифицированных, rxjava и кинжалов Модуль библиотеки Android Kotlin экспортируется с плагином gradene maven-publish, не добавляющим зависимости Итерировать значения перечисления, используя значения () и valueOf в kotlin Как извлечь карту из коллекции объектов, с ключом как одним из объектов того же поля и значением фактических объектов Параметр функции Kotlin: Val не может быть переназначен Общие методы и наследование Котлина Как сопоставить строку JSON с Kotlin Map Ошибка в печатном простом номере с использованием функций высокого порядка в котлине anko doAsync onComplete Ошибка при использовании callBy для функции с параметрами по умолчанию в Котлине