Sobes.tech
Middle+

Como implementaria uma coroutine não cancelável?

sobes.tech IA

Resposta da IA

Para implementar uma coroutine não cancelável, pode-se usar o contexto NonCancellable.

import kotlinx.coroutines.*

suspend fun performNonCancellableOperation() {
    coroutineScope {
        launch {
            // Esta coroutine pode ser cancelada
            delay(1000)
            println("Esta coroutine foi executada")
        }

        withContext(NonCancellable) {
            // Esta coroutine não será cancelada, mesmo que seu escopo pai seja cancelado
            try {
                delay(2000) // Simulação de uma operação prolongada
                println("Operação não cancelável concluída")
            } catch (e: CancellationException) {
                // A coroutine ainda pode receber CancellationException
                // em certos casos (por exemplo, ao fechar a aplicação),
                // mas ela não será cancelada reativamente à cancelamento do pai.
                println("Operação não cancelável foi cancelada: ${e.message}")
            } finally {
                // Este bloco será executado mesmo em caso de cancelamento
                println("Operação não cancelável finalizada (finally)")
            }
        }
    }
}

O uso de NonCancellable é útil para realizar operações finais, como salvar dados ou liberar recursos, quando a coroutine foi cancelada.

É importante lembrar que NonCancellable torna a coroutine insensível à cancelamento do contexto, mas ela ainda pode ser cancelada ao fechar a máquina virtual ou em outros casos extremos. Além disso, se dentro de withContext(NonCancellable) for chamada uma função suspensa que verifica a cancelamento (por exemplo, delay), ela pode lançar uma CancellationException. Portanto, recomenda-se usar try-catch-finally para lidar com essas situações.