Основные билдеры корутин? Разница между launch и async

В Kotlin Coroutines есть три основных билдера для запуска корутин:

  • launch() — Запускает корутину без результата и возвращает Job. Лучше использовать для UI-обновлений, отправка аналитики, логи, сохранение в БД без результата
  • async() — Запускает корутину с результатом и возвращает Deferred<T> (похоже на Future). Используйте для параллельных вычислений, когда нужен результат (например, загрузка данных с нескольких API)
  • runBlocking() — Блокирует текущий поток до завершения и возвращает результат блока.

Ключевая разница между launch() и async()

launch() — это fire-and-forget, возвращает Job, ошибки сразу пробрасываются вверх. async() — это «будущий результат», возвращает Deferred, ошибки откладываются и выстреливают только в момент await().

Ошибки, которые часто делают:

ОшибкаПочему плохо?
val data = async { ... } без await()Корутина запускается, но результат не используется
async без try-catch вокруг await()Исключение произойдёт при await, не в момент async
Использование runBlocking в UI/проектахБлокирует поток, используется только в тестах


Опубликовано

в

,

от

Метки: