Middle+
Kā jūs realizētu neatsaucamu korutīnu?
sobes.tech AI
Atbilde no AI
Neatcelšanas korutīnas īstenošanai var izmantot kontekstu NonCancellable.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Šī korutina var tikt atcelta
delay(1000)
println("Šī korutina ir izpildīta")
}
withContext(NonCancellable) {
// Šī korutina netiks atcelta, pat ja tās vecāks scopes tiks atcelts
try {
delay(2000) // Ilgstošas operācijas imitācija
println("Neatceļama operācija ir izpildīta")
} catch (e: CancellationException) {
// Korutina joprojām var saņemt CancellationException
// dažos gadījumos (piemēram, aizverot lietotni),
// bet tā netiks atcelta reaktīvi no vecāka.
println("Neatceļama operācija tika atcelta: ${e.message}")
} finally {
// Šis bloks tiks izpildīts pat atceļot
println("Neatceļama operācija ir pabeigta (finally)")
}
}
}
}
NonCancellable izmantošana ir noderīga, lai pabeigtu operācijas, piemēram, datu saglabāšanu vai resursu atbrīvošanu, kad korutina ir atcelta.
Svarīgi atcerēties, ka NonCancellable padara korutinu nejutīgu pret atcelšanu no konteksta, bet tā joprojām var tikt atcelta, aizverot virtuālo mašīnu vai citos ekstremālos gadījumos. Tāpat, ja withContext(NonCancellable) iekšienē izsaucama apturēšanas funkcija, kas pati pārbauda atcelšanu (piemēram, delay), tā var izraisīt CancellationException. Tādēļ ieteicams izmantot try-catch-finally šādām situācijām.