За счет чего происходит переключение между состояниями стейт-машины в Coroutines

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

Ответ

В Coroutines переключение между состояниями стейт-машины происходит за счет приостановки (suspend) и возобновления (resume) выполнения корутины. Компилятор преобразует suspend-функции в конечный автомат, где каждое состояние соответствует точке приостановки.

Когда корутина приостанавливается (например, при вызове другой suspend-функции), текущее состояние сохраняется, а поток освобождается. После завершения асинхронной операции корутина возобновляется с сохраненного состояния.

Пример:

suspend fun fetchData() {
    val data = api.fetch() // suspend point (состояние 1)
    process(data)          // состояние 2
}

Компилятор разбивает эту функцию на состояния:

  1. До вызова api.fetch()
  2. После возврата из api.fetch()
  3. После process(data)