Middle+
Kaip įgyvendintumėte negrąžinamą korutiną?
sobes.tech AI
Atsakymas iš AI
Neatšaukiamos korutinos įgyvendinimui galite naudoti kontekstą NonCancellable.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Ši korutina gali būti atšaukta
delay(1000)
println("Ši korutina įvykdyta")
}
withContext(NonCancellable) {
// Ši korutina nebus atšaukta, net jei jos tėvinis scope bus atšauktas
try {
delay(2000) // Ilgalaikės operacijos imitacija
println("Neatšaukiama operacija įvykdyta")
} catch (e: CancellationException) {
// Korutina vis tiek gali gauti CancellationException
// tam tikrais atvejais (pvz., uždarant programą),
// bet ji nebus reaktyviai atšaukta tėvo.
println("Neatšaukiama operacija buvo atšaukta: ${e.message}")
} finally {
// Šis blokas įvykdys net ir atšaukus
println("Neatšaukiama operacija baigta (finally)")
}
}
}
}
Naudojimas NonCancellable yra naudingas užbaigti operacijas, tokias kaip duomenų išsaugojimas ar išteklių atlaisvinimas, kai korutina buvo atšaukta.
Svarbu prisiminti, kad NonCancellable padaro korutiną nejautrią atšaukimo atžvilgiu iš konteksto, bet ji vis tiek gali būti atšaukta uždarant virtualią mašiną ar kitais ekstremaliais atvejais. Taip pat, jei withContext(NonCancellable) viduje iškviečiama sustabdymo funkcija, kuri pati tikrina atšaukimą (pvz., delay), ji gali išmesti CancellationException. Todėl rekomenduojama naudoti try-catch-finally tokioms situacijoms valdyti.