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 για τη διαχείριση τέτοιων καταστάσεων.