Sobes.tech
Middle+

Cum ați implementa o corutină care nu poate fi anulată?

sobes.tech AI

Răspuns de la AI

Pentru a implementa o coroutine non-cancelabilă, poți folosi contextul NonCancellable.

import kotlinx.coroutines.*

suspend fun performNonCancellableOperation() {
    coroutineScope {
        launch {
            // Această coroutine poate fi anulată
            delay(1000)
            println("Această coroutine a fost executată")
        }

        withContext(NonCancellable) {
            // Această coroutine nu va fi anulată, chiar dacă scope-ul părinte este anulat
            try {
                delay(2000) // Simulare a unei operații lungi
                println("Operație non-cancelabilă finalizată")
            } catch (e: CancellationException) {
                // Coroutine poate primi în continuare CancellationException
                // în anumite cazuri (de exemplu, la închiderea aplicației),
                // dar nu va fi anulată reactiv la anularea părintelui.
                println("Operație non-cancelabilă a fost anulată: ${e.message}")
            } finally {
                // Acest bloc va fi executat chiar și în cazul anulării
                println("Operație non-cancelabilă încheiată (finally)")
            }
        }
    }
}

Utilizarea NonCancellable este utilă pentru efectuarea operațiilor finale, cum ar fi salvarea datelor sau eliberarea resurselor, atunci când coroutine a fost anulată.

Este important să reții că NonCancellable face ca coroutine să fie insensibilă la anulare din context, dar ea poate fi totuși anulată la închiderea mașinii virtuale sau în alte cazuri extreme. De asemenea, dacă în interiorul withContext(NonCancellable) se apelează o funcție suspendantă care verifică ea însăși anularea (de exemplu, delay), aceasta poate arunca o CancellationException. Prin urmare, se recomandă utilizarea try-catch-finally pentru gestionarea acestor situații.