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ı:Flowtə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,flowWithLifecyclevə yacollectLatestilə), 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
}
}