Как suspend функция уведомляет о своей приостановке

«Как suspend функция уведомляет о своей приостановке» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Suspend-функции используют механизм Continuation Passing Style (CPS). При компиляции в байткод каждая suspend-функция получает дополнительный параметр Continuation, который хранит состояние и точку возобновления.

Когда функция приостанавливается (например, при вызове другой suspend-функции или delay()), она возвращает специальное значение COROUTINE_SUSPENDED. Это сигнализирует корутине, что выполнение нужно приостановить.

Пример:

suspend fun fetchData(): String {
    delay(1000) // здесь происходит приостановка
    return "Data"
}

После компиляции этот код превращается в машину состояний, где каждое состояние соответствует точке приостановки, а Continuation сохраняет текущее состояние и локальные переменные.