Sobes.tech
Middle+

Android-ში კორუტინებთან მუშაობისას რა გაუთვალისწინებელი პრობლემები შეიძლება წარმოიშვას?

sobes.tech AI

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

  • უცნობი გაუქმება (cancellation): კურუტინა შეიძლება გაუქმდეს გაუგებრად, მაგალითად, მოწყობილობის კონფიგურაციის შეცვლის ან Activity/Fragment-ის დახურვის დროს, თუ ციკლის ცხოვრების კონტექსტი სწორად არ არის მართული. ეს შეიძლება გამოიწვიოს მეხსიერების ლიკებმა ან გაუკეთილ ოპერაციებმა.
  • კონტექსტის გადაცემის პრობლემები: კურუტინული კონტექსტის გადაცემა აპლიკაციის ფენებს შორის (UI, ViewModel, Repository) საჭიროებს ყურადღებას. კონტექსტის არასწორი გამოყენება შეიძლება გამოიწვიოს UI-ის ჩაშლას ან ნაკადების ბლოკირებას.
  • რესურსების ლიკები გაუკეთილ გამონაკლისებთან: გაუკეთილი გამონაკლისები შვილობილი კურუტინებში შეიძლება გაუკეთოს მშობელი, მაგრამ შიგნით გამოყოფილი რესურსები არ შეიძლება გათავისუფლდეს.
  • "ცივი" ნაკადები (Flow) და მათი ციკლის მართვა: Flow ბუნებით ნელია და საჭიროებს აქტიურ მონაცემთა შეგროვებას. თუ შეგროვება არ არის სწორად მართული (მაგალითად, flowWithLifecycle ან collectLatest გამოყენებით), შეიძლება გამოიწვიოს არასასურველი ქცევა UI-ის ან ციკლის ცვლილებების დროს.
  • ბლოკირებადი ზარები: ბლოკირებადი ზარების (მაგალითად, ქსელის ან ფაილური ოპერაციების) ჩართვა კურუტინში, რომელიც შესრულდება მთავარი ნაკადის დისპეტჩერში (Dispatchers.Main), გამოიწვევს ANR-ს.
// მაგალითი კურუტინების გაუქმების პრობლემის კონფიგურაციის ცვლილების დროს
class MyViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch {
            // ხანგრძლივი ოპერაცია
            delay(5000)
            // თუ Activity-ის გადაკეთება ხდება დროს, ეს ხაზი შეიძლება არ შესრულდეს
            println("Data loaded")
        }
    }
}

// Block Blocking Call-ის მაგალითი Main დისპეტჩერში
import kotlinx.coroutines.*

fun performBlockingOperation() {
    runBlocking { // არ გამოიყენოთ UI ნაკადში!
        delay(1000) // ბლოკავს ნაკადს
    }
}

// სწორად უნდა იყოს:
fun performNonBlockingOperation() {
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000) // არ ბლოკავს ძირითად ნაკადს
    }
}