Sobes.tech
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.