> Как остановить корутину и гарантированно отменить ее в Kotlin (Kotlin, Android)

Уровень: senior · Роль: mobile · Категория: Технические вопросы

Компании: Астра

Стек: Kotlin, Android

> Пример ответа

Для гарантированной отмены корутины в Kotlin используется механизм структурированной конкурентности и функция cancel(). Основной подход - запускать корутину в скоупе (например, CoroutineScope), который можно отменить целиком.

Пример:

val scope = CoroutineScope(Dispatchers.Main + SupervisorJob())

// Запуск корутины
val job = scope.launch {
    repeat(100) { i ->
        // Проверка на отмену внутри корутины
        ensureActive()
        delay(100)
        println("Шаг $i")
    }
}

// Отмена через 500 мс
scope.launch {
    delay(500)
    job.cancel() // или scope.cancel() для всех корутин в скоупе
}

Гарантированная отмена требует, чтобы корутина была кооперативной - она должна периодически проверять состояние отмены через:

  • isActive - флаг активности корутины
  • ensureActive() - выбрасывает CancellationException, если корутина отменена
  • yield() - принудительная передача управления и проверка отмены

Для некооперативных операций (например, блокирующий ввод-вывод) используйте withContext(Dispatchers.IO) { ... } или оборачивайте в suspendCancellableCoroutine.

Важно: после вызова cancel() корутина не останавливается мгновенно - она завершится при следующей проверке отмены. Для ожидания полного завершения используйте job.join().

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью