Почему вы все равно должны удалить код из основного потока на Android, даже если задача приостановлена
Вы не делаете. Единственное правило
Любое отдельное событие, взятое из очереди событий основного потока, не должно занять много времени.
где "long" - это, вероятно, все, что больше миллисекунды или двух.
Если вы выполняете блокирующую, синхронизирующую операцию в обработчике событий, она засчитывается во время выполнения этого обработчика событий.
Если вы выполняете неблокирующую, асинхронную операцию в обработчике событий, обработчик фактически завершает работу, как только инициирует операцию, гарантируя, что позднее в очередь будет добавлено другое событие, когда результат операции готов.
В этом суть кооперативной и вытесняющей многопоточности: в первом случае пользовательский код отвечает за разбиение всей задачи на несколько легких событий, тогда как во втором случае ОС применяет ее независимо от того, что делает код , Поскольку весь графический интерфейс пользователя должен выполняться в одном потоке, вытесняющая многопоточность не подходит.
Так, конкретно, в Kotlin вы можете написать
launch(Dispatchers.Main) {
val user = makeRestCall("/users/$id")
usernameText.text = user.name
}
с некоторыми suspend fun makeRestCall(url: String)
.