Sobes.tech
Middle+

Kā jūs realizētu neatsaucamu korutīnu?

sobes.tech AI

Atbilde no AI

Neatcelšanas korutīnas īstenošanai var izmantot kontekstu NonCancellable.

import kotlinx.coroutines.*

suspend fun performNonCancellableOperation() {
    coroutineScope {
        launch {
            // Šī korutina var tikt atcelta
            delay(1000)
            println("Šī korutina ir izpildīta")
        }

        withContext(NonCancellable) {
            // Šī korutina netiks atcelta, pat ja tās vecāks scopes tiks atcelts
            try {
                delay(2000) // Ilgstošas operācijas imitācija
                println("Neatceļama operācija ir izpildīta")
            } catch (e: CancellationException) {
                // Korutina joprojām var saņemt CancellationException
                // dažos gadījumos (piemēram, aizverot lietotni),
                // bet tā netiks atcelta reaktīvi no vecāka.
                println("Neatceļama operācija tika atcelta: ${e.message}")
            } finally {
                // Šis bloks tiks izpildīts pat atceļot
                println("Neatceļama operācija ir pabeigta (finally)")
            }
        }
    }
}

NonCancellable izmantošana ir noderīga, lai pabeigtu operācijas, piemēram, datu saglabāšanu vai resursu atbrīvošanu, kad korutina ir atcelta.

Svarīgi atcerēties, ka NonCancellable padara korutinu nejutīgu pret atcelšanu no konteksta, bet tā joprojām var tikt atcelta, aizverot virtuālo mašīnu vai citos ekstremālos gadījumos. Tāpat, ja withContext(NonCancellable) iekšienē izsaucama apturēšanas funkcija, kas pati pārbauda atcelšanu (piemēram, delay), tā var izraisīt CancellationException. Tādēļ ieteicams izmantot try-catch-finally šādām situācijām.