Middle+
Ինչպե՞ս կկատարեիք անջատվող կորուտին։
sobes.tech AI
Պատասխան AI-ից
Նախագծելու համար անջատվող չհետաձգվող coroutine, կարող եք օգտագործել NonCancellable կոնտեքստը:
import kotlinx.coroutines.*
suspend fun performNonCancellableOperation() {
coroutineScope {
launch {
// Այս coroutine-ը կարող է չեղարկվել
delay(1000)
println("Այս coroutine-ը կատարվեց")
}
withContext(NonCancellable) {
// Այս coroutine-ը չի չեղարկվի, նույնիսկ եթե նրա ծնողական scope-ը չեղարկվի
try {
delay(2000) // Դիտարկում երկարատև գործողության
println("Չհետաձգվող գործողություն ավարտվեց")
} catch (e: CancellationException) {
// Coroutine-ը դեռ կարող է ստանալ CancellationException
// որոշ դեպքերում (օրինակ, հավելվածի փակման ժամանակ),
// բայց այն չի լինի ռեակցիվ չեղարկված ծնողի չեղարկման վրա:
println("Չհետաձգվող գործողությունը չեղարկվեց: ${e.message}")
} finally {
// Այս բլոկը կկատարվի նույնիսկ չեղարկման դեպքում
println("Չհետաձգվող գործողությունը ավարտվեց (finally)")
}
}
}
}
NonCancellable-ի օգտագործումը օգտակար է ավարտական գործողություններ կատարելու համար, ինչպիսիք են տվյալների պահպանումը կամ ռեսուրսների ազատումը, երբ coroutine-ը չեղարկվել է:
Հիշեք, որ NonCancellable-ը դարձնում է coroutine անզգայուն կոնտեքստից չեղարկման նկատմամբ, բայց այն դեռ կարող է չեղարկվել վիրտուալ մեքենայի փակման ժամանակ կամ այլ ծայրահեղ դեպքերում: Բացի այդ, եթե withContext(NonCancellable)-ի ներսում կանչվում է կանգնեցնող ֆունկցիա, որը ինքն է ստուգում չեղարկումը (օրինակ, delay), այն կարող է արտածել CancellationException: Այդ պատճառով խորհուրդ է տրվում օգտագործել try-catch-finally նման իրավիճակների կառավարում համար։