В 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/проектах | Блокирует поток, используется только в тестах |