Я предполагаю, что это похоже на то, как JavaScript управляет операциями блокировки с событием l oop
Да, это правильно, событие l oop важно, чтобы заставить сопрограммы работать. В основном, когда вы пишете это:
uiScope.launch {
delay(1000)
println("A second has passed")
}
, оно компилируется в код, который имеет тот же эффект, что и этот:
Handler(Looper.mainLooper()).postDelayed(1000) { println("A second has passed") }
Основная концепция - продолжение , объект, который реализует конечный автомат, который соответствует последовательному коду, который вы написали в приостановленной функции. Когда вы вызываете delay
или любую другую приостановляемую функцию, метод точки входа продолжения возвращает специальное значение COROUTINE_SUSPENDED
. Позже, когда какой-то внешний код обнаруживает возвращаемое значение приостановленной функции, он должен вызвать continuation.resume(result)
. Этот вызов будет перехвачен ответственным диспетчером, который опубликует этот вызов как событие в событии GUI l oop. Когда обработчик событий снят с очереди и выполняется, вы возвращаетесь в конечный автомат, который выясняет, где возобновить выполнение.
Вы можете просмотреть этот ответ для более подробного примера используя Continuation
API.