Для реализации неотменяемой корутины можно использовать контекст NonCancellable.
Как бы вы реализовали неотменяемую корутину?
Для реализации неотменяемой корутины можно использовать контекст NonCancellable.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Для реализации неотменяемой корутины можно использовать контекст NonCancellable.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Эта корутина может быть отменена
delay(1000)
println("Эта корутина выполнена")
}
withContext(NonCancellable) {
// Эта корутина не будет отменена, даже если ее родительский скоуп отменен
try {
delay(2000) // Имитация длительной операции
println("Неотменяемая операция выполнена")
} catch (e: CancellationException) {
// Корутина все равно может получить CancellationException
// в определенных случаях (например, при закрытии приложения),
// но она не будет отменяться реактивно на отмену родителя.
println("Неотменяемая операция была отменена: ${e.message}")
} finally {
// Этот блок выполнится даже при отмене
println("Неотменяемая операция завершена (finally)")
}
}
}
}
Использование NonCancellable полезно для выполнения завершающих операций, таких как сохранение данных или освобождение ресурсов, когда корутина была отменена.
Важно помнить, что NonCancellable делает корутину нечувствительной к отмене из контекста, но она может все равно быть отменена при закрытии виртуальной машины или в других крайних случаях. Также, если внутри withContext(NonCancellable) вызывается приостанавливающая функция, которая сама проверяет на отмену (например, delay), она может выбросить CancellationException. Поэтому рекомендуется использовать try-catch-finally для обработки таких ситуаций.