В Kotlin для асинхронного программирования используются корутины, а не async/await в привычном смысле, как в C# или JavaScript. Однако, библиотека kotlinx.coroutines предоставляет функции async и await, которые реализуют схожий паттерн, основанный на корутинах.
Как это работает:
async: Это функция-билдер (CoroutineScope extension function), которая запускает новую корутину параллельно и возвращает отложенное значение типа Deferred<T>. Deferred<T> - это своеобразный "будущий" результат вычислений, который еще не готов. Выполнение кода после вызова async продолжается сразу, не дожидая завершения асинхронной операции.
kotlin
await: Это suspend-функция, вызываемая на объекте Deferred<T>. Она приостанавливает выполнение текущей корутины до тех пор, пока асинхронная операция, запущенная с помощью async, не завершится и не будет готов результат. await возвращает готовое значение типа T.
kotlin
Ключевые моменты:
async создает новую корутину, а await приостанавливает текущую корутину без блокировки потока.Deferred<T>: Это аналог Promise в JavaScript или Task<T> в C#. Он представляет собой результат, который будет доступен в будущем. Deferred наследуется от Job, что позволяет управлять жизненным циклом асинхронной операции (отменять, проверять статус).await не блокирует поток, в котором выполняется корутина. Вместо этого он приостанавливает корутину, освобождая поток для выполнения других задач. Когда результат асинхронной операции готов, корутина возобновляется.async, так и launch (другой билдер корутин) являются CoroutineScope extension functions. Это означает, что они должны запускаться внутри определенной области видимости (Scope). Scope управляет жизненным циклом запущенных в нем корутин.async, сохраняются в объекте Deferred и будут переброшены при вызове await.Сравнение с launch:
| Аспект | launch | async |
|---|---|---|
| Возвращаемый тип | Job | Deferred<T> (наследуется от Job) |
| Цель | "Запусти и забудь" (побочные эффекты) | Получение результата |
| Ждет завершения | Нет (если не использовать join()) | Да (при использовании await()) |
| Пример использования | Запуск UI-обновления | Выполнение сетевого запроса и обработка ответа |
async и await в Kotlin позволяют писать асинхронный код в последовательном стиле, делая его более читаемым и понятным, одновременно используя преимущества неблокирующих операций.