Cum ați implementa o corutină care nu poate fi anulată?
sobes.tech AI
Răspuns de la AI
Pentru a implementa o coroutine non-cancelabilă, poți folosi contextul NonCancellable.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Această coroutine poate fi anulată
delay(1000)
println("Această coroutine a fost executată")
}
withContext(NonCancellable) {
// Această coroutine nu va fi anulată, chiar dacă scope-ul părinte este anulat
try {
delay(2000) // Simulare a unei operații lungi
println("Operație non-cancelabilă finalizată")
} catch (e: CancellationException) {
// Coroutine poate primi în continuare CancellationException
// în anumite cazuri (de exemplu, la închiderea aplicației),
// dar nu va fi anulată reactiv la anularea părintelui.
println("Operație non-cancelabilă a fost anulată: ${e.message}")
} finally {
// Acest bloc va fi executat chiar și în cazul anulării
println("Operație non-cancelabilă încheiată (finally)")
}
}
}
}
Utilizarea NonCancellable este utilă pentru efectuarea operațiilor finale, cum ar fi salvarea datelor sau eliberarea resurselor, atunci când coroutine a fost anulată.
Este important să reții că NonCancellable face ca coroutine să fie insensibilă la anulare din context, dar ea poate fi totuși anulată la închiderea mașinii virtuale sau în alte cazuri extreme. De asemenea, dacă în interiorul withContext(NonCancellable) se apelează o funcție suspendantă care verifică ea însăși anularea (de exemplu, delay), aceasta poate arunca o CancellationException. Prin urmare, se recomandă utilizarea try-catch-finally pentru gestionarea acestor situații.