Sobes.tech
Middle+

როგორ განახორციელებდით გაუქმებუარ კუროტინას?

sobes.tech AI

პასუხი AI-სგან

დაუქმებელი კორუტინის განხორციელებისთვის შეგიძლიათ გამოიყენოთ კონტექსტი NonCancellable.

import kotlinx.coroutines.*

suspend fun performNonCancellableOperation() {
    coroutineScope {
        launch {
            // ეს კორუტინა შეიძლება გაუქმდეს
            delay(1000)
            println("ეს კორუტინა შესრულდა")
        }

        withContext(NonCancellable) {
            // ეს კორუტინა არ გაუქმდება, თუნდაც მისი მშობელი სკოპი გაუქმდეს
            try {
                delay(2000) // გრძელვადიანი ოპერაციის იმიტაცია
                println("დაუქმებელი ოპერაცია შესრულდა")
            } catch (e: CancellationException) {
                // კორუტინა მაინც შეიძლება მიიღოს CancellationException
                // გარკვეულ შემთხვევებში (მაგალითად, აპლიკაციის დახურვისას),
                // მაგრამ ის არ გაუქმდება რეაქტიულად მშობლის გაუქმებაზე.
                println("დაუქმებელი ოპერაცია გაუქმდა: ${e.message}")
            } finally {
                // ეს ბლოკი შესრულდება მაშინაც, როდესაც გაუქმდება
                println("დაუქმებელი ოპერაცია დასრულდა (finally)")
            }
        }
    }
}

NonCancellable-ის გამოყენება სასარგებლოა დასასრულის ოპერაციების განსახორციელებლად, როგორიცაა მონაცემების შენახვა ან რესურსების გათავისუფლება, როდესაც კორუტინა გაუქმდა.

მნიშვნელოვანია გახსოვდეთ, რომ NonCancellable ხდის კორუტინას შეუცნობელს გაუქმების მიმართ კონტექსტიდან, მაგრამ ის შეიძლება მაინც გაუქმდეს ვირტუალური მანქანის დახურვის ან სხვა ექსტრემალურ შემთხვევებში. ასევე, თუ withContext(NonCancellable) შიგნით გამოიძახება შეჩერების ფუნქცია, რომელიც თავად ამოწმებს გაუქმებას (მაგალითად, delay), ის შეიძლება გამოიწვიოს CancellationException. ამიტომ რეკომენდებულია გამოიყენოთ try-catch-finally ასეთი სიტუაციების მართვისთვის.