Что такое suspend-функции?

suspend-функции в Kotlin — это функции, которые можно приостанавливать и возобновлять без блокировки потока. Они являются основой корутин (lightweight потоков) и позволяют писать асинхронный, неблокирующий код в императивном стиле, как если бы он был синхронным.

🧠 Что делает suspend

Ключевое слово suspend указывает, что функция:

  • может приостанавливать своё выполнение,

  • вызывается только из другой suspend-функции или корутины,

  • может быть возобновлена позже, возможно — на другом потоке.

Пример

suspend fun fetchData(): String {
delay(1000) // Приостанавливает выполнение на 1 секунду
return "Готово"
}

Эта функция не блокирует поток, на котором запущена. Вместо этого delay() просто приостанавливает выполнение корутины и даёт возможность другим задачам выполняться в это время.

🚀 Как вызывать suspend-функции

suspend-функции нельзя вызывать напрямую из обычного кода. Они требуют контекста корутины:

fun main() = runBlocking {
val result = fetchData()
println(result)
}
  • runBlocking создаёт корутинный контекст для вызова suspend-функции в main().

  • В Android вместо runBlocking обычно используется lifecycleScope, viewModelScope или CoroutineScope.

📌 suspend ≠ асинхронно

suspend не делает функцию автоматически асинхронной. Она становится асинхронной, если внутри вызывает другие приостанавливаемые функции, такие как delay(), withContext(), await() и т.п.

suspend fun doSomething() {
println("Start")
delay(1000) // приостанавливает
println("End")
}

📦 Преимущества suspend-функций

  • 📄 Код читается как обычный последовательный, без вложенных колбэков.

  • 🧵 Потоки не блокируются — эффективное использование ресурсов.

  • 🔄 Хорошо интегрируется с LiveData, Flow, Room, Retrofit, WorkManager и т.д.

  • 💡 Компилятор превращает suspend-функции в state machine (машину состояний), обрабатывающую паузы/возобновления.

Пример в Android

viewModelScope.launch {
val data = fetchFromNetwork()
updateUI(data)
}

suspend fun fetchFromNetwork(): String {
delay(1000)
return "Данные получены"
}

Отличие от обычных функций

Обычная функция suspend-функция
Работает синхронно Может приостанавливаться
--- ---
Вызывается напрямую Вызывается только из корутины
--- ---
Блокирует поток Не блокирует
--- ---
Не может вызывать suspend Может вызывать suspend
--- ---

Пример вложенности

suspend fun getUserData() {
val token = getTokenFromServer()
val user = fetchUserProfile(token)
showUser(user)
}

Весь этот код — последовательный и читаемый, но внутри асинхронный и неблокирующий.

Таким образом, suspend-функции — это мощный инструмент Kotlin для написания асинхронного кода без колбэков, который выглядит и ведёт себя как обычный синхронный код, но при этом эффективно использует потоки и ресурсы.