Middle+
138
questionbank
Как бы вы реализовали неотменяемую корутину?
Answer from AI
sobes.tech AI
Для реализации неотменяемой корутины можно использовать контекст 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 для обработки таких ситуаций.