Можно ли отменить запущенную Deffered

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

Ответ

Да, отменить запущенную Deferred можно с помощью функции cancel(). Однако, отмена работает только если корутина ещё не завершилась и поддерживает отмену (например, не выполняет блокирующий код без проверки isActive).

Пример:

val deferred = GlobalScope.async {
    repeat(1000) { i ->
        println("Tick $i")
        delay(100)
    }
}

// Через 500 мс отменяем
delay(500)
deferred.cancel()

После отмены:

  • deferred.isCancelled вернет true
  • При вызове await() будет выброшено CancellationException

Важно: отмена не прерывает поток мгновенно - корутина должна проверять isActive или использовать отменяемые функции типа delay().