Sobes.tech
Middle+

Android-də korutinlərlə işləyərkən hansı gözlənilməz problemlər baş verə bilər?

sobes.tech Süni İntellekt

AI-dan cavab

  • Gözlənilməz ləğv: Coroutine qeyri-ixtiyari ləğv oluna bilər, məsələn, cihaz konfiqurasiyasını dəyişdirmək və ya Activity/Fragment bağlamaq zamanı, əgər həyat dövrü konteksti diqqətlə idarə olunmayıbsa. Bu, yaddaş sızıntılarına və ya tamamlanmamış əməliyyatlara səbəb ola bilər.
  • Kontekst ilə bağlı problemlər (kontekst ötürülməsi): Coroutine kontekstinin tətbiqin qatları arasında (UI, ViewModel, Repository) ötürülməsi diqqət tələb edir. Yanlış istifadə UI və ya ipliklərin donmasına səbəb ola bilər.
  • İdarə olunmayan istisnalar səbəbindən resurs sızıntıları: Uşaq coroutine-lərdə idarə olunmayan istisnalar valideyn coroutine-i qeyri-ixtiyari ləğv edə bilər, lakin uşaq daxilində ayrılmış resurslar sərbəst buraxılmaya bilər.
  • "Soyuq" axınlar (Flow) və həyat dövrünün idarə olunması: Flow təbiətcə tənbəldir və aktiv məlumat toplanmasını tələb edir. Toplama düzgün idarə olunmazsa (məsələn, flowWithLifecycle və ya collectLatest ilə), UI və ya həyat dövrü dəyişikliklərində istənməyən davranışlar baş verə bilər.
  • Bloklayıcı çağırışlar: Şəbəkə və ya fayl əməliyyatları kimi bloklayıcı çağırışların əsas ipdə (Dispatchers.Main) icra olunması ANR-ə səbəb olar.
// Konfiqurasiya dəyişiklikləri zamanı coroutine ləğvi ilə bağlı potensial problem nümunəsi
class MyViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch {
            // Uzun müddətli əməliyyat
            delay(5000)
            // Əgər Activity delay zamanı yenidən yaradılırsa, bu sətir icra olunmaya bilər
            println("Məlumatlar yükləndi")
        }
    }
}

// Main dispatcher-də bloklayıcı çağırış nümunəsi
import kotlinx.coroutines.*

fun performBlockingOperation() {
    runBlocking { // UI axışında istifadə etməyin!
        delay(1000) // Axını bloklayır
    }
}

// Belə olmalıdır:
fun performNonBlockingOperation() {
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000) // Əsas axını bloklamır
    }
}