Вопрос объясняет механизм преобразования suspend-функций в стейт-машину.
Компилятор разбивает suspend-функцию на стейт-машину, где каждый suspend-вызов — это состояние. При возобновлении выполняется переход к следующему состоянию.
Исходная функция:
suspend fun fetchData(): String {
val data = api.fetch() // Точка приостановки 1
return data.uppercase() // Точка приостановки 2
}После компиляции (псевдокод):
class FetchDataStateMachine : Continuation<...> {
var state = 0
var result: Any? = null
override fun resumeWith(result: Result<...>) {
when (state) {
0 -> {
state = 1
api.fetch(this) // Запуск с колбэком
}
1 -> {
val data = result as String
println(data.uppercase())
}
}
}
}Каждый suspend-вызов — переход между состояниями.
Локальные переменные сохраняются в полях стейт-машины.