Sobes.tech
Middle+

İptal edilə bilməyən korutini necə həyata keçirərdiniz?

sobes.tech Süni İntellekt

AI-dan cavab

İmtina edilməyən korutina həyata keçirmək üçün NonCancellable kontekstindən istifadə edə bilərsiniz.

import kotlinx.coroutines.*

suspend fun performNonCancellableOperation() {
    coroutineScope {
        launch {
            // Bu korutina ləğv oluna bilər
            delay(1000)
            println("Bu korutina icra olundu")
        }

        withContext(NonCancellable) {
            // Bu korutina ləğv olunmayacaq, hətta onun valideyn scope-u ləğv olunsa belə
            try {
                delay(2000) // Uzunmüddətli əməliyyatın simulyasiyası
                println("Ləğv edilə bilməyən əməliyyat tamamlandı")
            } catch (e: CancellationException) {
                // Korutina hələ də CancellationException ala bilər
                // bəzi hallarda (məsələn, tətbiqi bağlamaqda),
                // amma o, valideynin ləğv edilməsinə reaktiv şəkildə cavab verməyəcək.
                println("Ləğv edilə bilməyən əməliyyat ləğv olundu: ${e.message}")
            } finally {
                // Bu blok hətta ləğv olunsa belə icra olunacaq
                println("Ləğv edilə bilməyən əməliyyat tamamlandı (finally)")
            }
        }
    }
}

NonCancellable istifadə etmək, korutina ləğv edildikdən sonra yekun əməliyyatları həyata keçirmək üçün, məsələn, məlumatların saxlanması və ya resursların sərbəst buraxılması üçün faydalıdır.

Əhəmiyyətlidir ki, NonCancellable kontekstindən ləğv etməyə qarşı davamlı edir, amma o, virtual maşını bağlamaqda və ya digər ekstremal hallarda hələ də ləğv edilə bilər. Bundan başqa, withContext(NonCancellable) daxilində çağırılan və özündə ləğv etməyi yoxlayan (məsələn, delay) suspend funksiyası, CancellationException atə bilər. Buna görə, belə vəziyyətləri idarə etmək üçün try-catch-finally istifadə etmək tövsiyə olunur.