Всегда ли можно отменить Coroutine

«Всегда ли можно отменить Coroutine» — вопрос из категории Coroutines и Flow, который задают на 23% собеседований Android Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Отмена корутины возможна, но не гарантирована автоматически. Корутина отменяется только при явной проверке isActive или вызове yield(), ensureActive(), либо при использовании отменяемых suspending-функций (например, delay()). Долгие блокирующие операции без проверки отмены могут продолжить выполняться.

Пример:

scope.launch {
    while (isActive) { // явная проверка
        // работа
    }
}

Или с ensureActive():

scope.launch {
    repeat(100) {
        ensureActive() // выбросит CancellationException при отмене
        // работа
    }
}