Middle+
Kako biste implementirali neotkazivu korutinu?
sobes.tech АИ
Одговор од АИ
Za implementaciju neotmenjive korutine možete koristiti kontekst NonCancellable.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Ova korutina može biti otkazana
delay(1000)
println("Ova korutina je izvršena")
}
withContext(NonCancellable) {
// Ova korutina neće biti otkazana, čak ni ako njen roditeljski scope bude otkazan
try {
delay(2000) // Simulacija duže operacije
println("Neotmenjiva operacija završena")
} catch (e: CancellationException) {
// Korutina i dalje može primiti CancellationException
// u određenim slučajevima (npr. zatvaranje aplikacije),
// ali neće biti reaktivno otkazana na otkazivanje roditelja.
println("Neotmenjiva operacija je otkazana: ${e.message}")
} finally {
// Ovaj blok će se izvršiti čak i ako dođe do otkazivanja
println("Neotmenjiva operacija završena (finally)")
}
}
}
}
Korišćenje NonCancellable je korisno za izvršavanje završnih operacija, kao što su čuvanje podataka ili oslobađanje resursa, kada je korutina otkazana.
Važno je zapamtiti da NonCancellable čini korutinu neosetljivom na otkazivanje iz konteksta, ali ona i dalje može biti otkazana pri zatvaranju virtuelne mašine ili u drugim ekstremnim slučajevima. Takođe, ako se unutar withContext(NonCancellable) pozove suspend funkcija koja sama proverava otkazivanje (npr. delay), ona može baciti CancellationException. Zbog toga se preporučuje korišćenje try-catch-finally za rukovanje takvim situacijama.