Sobes.tech
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 նման իրավիճակների կառավարում համար։