Middle+
Jak byste implementovali neodvolatelnou korutinu?
sobes.tech AI
Odpověď od AI
Pro implementaci neodvolatelné coroutine můžete použít kontext NonCancellable.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Tato coroutine může být zrušena
delay(1000)
println("Tato coroutine byla provedena")
}
withContext(NonCancellable) {
// Tato coroutine nebude zrušena, i když její rodičovský scope bude zrušen
try {
delay(2000) // Simulace dlouhé operace
println("Nezrušitelná operace dokončena")
} catch (e: CancellationException) {
// Coroutine může stále obdržet CancellationException
// v určitých případech (například při zavírání aplikace),
// ale nebude reaktivně zrušena na zrušení rodiče.
println("Nezrušitelná operace byla zrušena: ${e.message}")
} finally {
// Tento blok bude vykonán i při zrušení
println("Nezrušitelná operace ukončena (finally)")
}
}
}
}
Použití NonCancellable je užitečné pro provádění závěrečných operací, jako je ukládání dat nebo uvolnění zdrojů, když byla coroutine zrušena.
Je důležité pamatovat, že NonCancellable činí coroutine necitlivou na zrušení z kontextu, ale může být stále zrušena při zavírání virtuálního stroje nebo v jiných krajních případech. Také, pokud uvnitř withContext(NonCancellable) je volána suspendní funkce, která sama kontroluje zrušení (například delay), může vyvolat CancellationException. Proto se doporučuje používat try-catch-finally k ošetření takových situací.