Что такое 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 для написания асинхронного кода без колбэков, который выглядит и ведёт себя как обычный синхронный код, но при этом эффективно использует потоки и ресурсы.