> Как остановить корутину и гарантированно отменить ее в 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().
> Похожие задачи по mobile
Может ли suspend функция работать вне CoroutineScope
Что такое smart cast в Kotlin
Как работают final и static в Kotlin и Java
Каким ключевым словом обозначаются параметры конструктора в data class Kotlin, если они используются только в init блоке
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью