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