Middle+
Ako by ste implementovali neodvolateľnú korutinu?
sobes.tech AI
Odpoveď od AI
Za implementáciu neodvolateľnej korutiny môžete použiť kontext NonCancellable.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Táto korutina môže byť zrušená
delay(1000)
println("Táto korutina bola vykonaná")
}
withContext(NonCancellable) {
// Táto korutina nebude zrušená, ani ak jej rodičovský scope bude zrušený
try {
delay(2000) // Simulácia dlhšej operácie
println("Nezrušiteľná operácia dokončená")
} catch (e: CancellationException) {
// Korutina stále môže dostať CancellationException
// v určitých prípadoch (napríklad pri zatváraní aplikácie),
// ale nebude reaktívne zrušená na zrušenie rodiča.
println("Nezrušiteľná operácia bola zrušená: ${e.message}")
} finally {
// Tento blok bude vykonaný aj pri zrušení
println("Nezrušiteľná operácia ukončená (finally)")
}
}
}
}
Použitie NonCancellable je užitočné na vykonanie záverečných operácií, ako je uloženie dát alebo uvoľnenie zdrojov, keď bola korutina zrušená.
Je dôležité pamätať, že NonCancellable robí korutinu necitlivou na zrušenie z kontextu, ale stále môže byť zrušená pri zatváraní virtuálnej mašiny alebo v iných extrémnych prípadoch. Okrem toho, ak sa vo vnútri withContext(NonCancellable) volá suspendná funkcia, ktorá sama kontroluje zrušenie (napríklad delay), môže vyhodiť CancellationException. Preto sa odporúča používať try-catch-finally na spracovanie takýchto situácií.