Ответ
Корутины упрощают асинхронный код, делая его более читаемым и поддерживаемым. В отличие от колбэков или RxJava, корутины позволяют писать последовательный код без вложенных callback-ов. Они легковесны (тысячи корутин могут работать в одном потоке) и интегрированы с Jetpack (ViewModel, Room). Пример:
viewModelScope.launch {
val data = repository.fetchData() // suspend-функция
updateUi(data) // выполняется в Main-потоке
}
Корутины поддерживают отмену, обработку ошибок и structured concurrency, что уменьшает утечки памяти. Они работают с Dispatchers (IO, Main, Default) для оптимизации потоков.