Middle+
Kuidas te implementiksite mittetühistatavat korutini?
sobes.tech AI
Vastus AI-lt
Demonstraator, kuidas kasutada NonCancellable konteksti mittetühistatavate korutinate teostamiseks.
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// See korutina võib olla tühistatud
delay(1000)
println("See korutina on täidetud")
}
withContext(NonCancellable) {
// See korutina ei saa tühistada, isegi kui selle vanem scope tühistatakse
try {
delay(2000) // Pikaajalise operatsiooni imitatsioon
println("Mittetühistatav operatsioon on täidetud")
} catch (e: CancellationException) {
// Korutina võib ikka saada CancellationException
// teatud juhtudel (näiteks rakenduse sulgemisel),
// kuid see ei tühistata reaktsiooniliselt vanemast.
println("Mittetühistatava operatsiooni tühistamine: ${e.message}")
} finally {
// See plokk täidetakse isegi tühistamise korral
println("Mittetühistatav operatsioon on lõpetatud (finally)")
}
}
}
}
NonCancellable kasutamine on kasulik lõpetavate operatsioonide, nagu andmete salvestamine või ressursside vabastamine, teostamiseks, kui korutina on tühistatud.
Oluline on meeles pidada, et NonCancellable muudab korutina tühistamatuks kontekstist, kuid see võib siiski olla tühistatud virtuaalse masina sulgemise või muude äärmuslike juhtumite korral. Samuti, kui withContext(NonCancellable) sees kutsutakse peatamise funktsioon, mis ise kontrollib tühistamist (näiteks delay), võib see visata CancellationException. Seetõttu on soovitatav kasutada try-catch-finally selliste olukordade käsitlemiseks.