Sobes.tech
Middle+

Android'de koroutinlerle çalışırken hangi beklenmedik sorunlar ortaya çıkabilir?

sobes.tech yapay zeka

AI'dan gelen yanıt

  • Beklenmedik iptal: Coroutine, örneğin cihaz yapılandırması değiştirildiğinde veya Activity/Fragment kapatıldığında, yaşam döngüsü bağlamı dikkatli yönetilmediği takdirde, dolaylı olarak iptal edilebilir. Bu, bellek sızıntılarına veya tamamlanmamış işlemlere yol açabilir.
  • Bağlam sorunları (bağlam iletimi): Uygulama katmanları (UI, ViewModel, Repository) arasında coroutine bağlamının aktarımı dikkat gerektirir. Yanlış bağlam kullanımı, UI donmalarına veya thread kilitlenmelerine neden olabilir.
  • İşlenmemiş istisnalar nedeniyle kaynak sızıntıları: Çocuk coroutine'lerdeki işlenmemiş istisnalar, ebeveyn coroutine'yi dolaylı olarak iptal edebilir, ancak çocuk içindeki kaynaklar serbest bırakılmayabilir.
  • "Soğuk" akışlar (Flow) ve yaşam döngüsü yönetimi: Flow doğası gereği tembel olup, aktif veri toplamayı gerektirir. Toplama düzgün yönetilmezse (örneğin, flowWithLifecycle veya collectLatest kullanılarak), UI veya yaşam döngüsü değişikliklerinde istenmeyen davranışlar ortaya çıkabilir.
  • Bloklayıcı çağrılar: Ağ veya dosya işlemleri gibi bloklayıcı çağrıların, ana akışta (Dispatchers.Main) çalışan coroutine içinde kullanılması, ANR'lere yol açar.
// Yapılandırma değişikliği sırasında coroutine iptaliyle ilgili potansiyel sorun örneği
class MyViewModel : ViewModel() {
    fun loadData() {
        viewModelScope.launch {
            // Uzun süren işlem
            delay(5000)
            // Eğer Activity, delay sırasında yeniden oluşturulursa, bu satır çalışmayabilir
            println("Veriler yüklendi")
        }
    }
}

// Ana dispatcher'da bloklayıcı çağrı örneği
import kotlinx.coroutines.*

fun performBlockingOperation() {
    runBlocking { // UI akışında kullanılmamalı!
        delay(1000) // Akışı engeller
    }
}

// Böyle olmalı:
fun performNonBlockingOperation() {
    CoroutineScope(Dispatchers.Default).launch {
        delay(1000) // Ana akışı engellemez
    }
}