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:Flowdoğası gereği tembel olup, aktif veri toplamayı gerektirir. Toplama düzgün yönetilmezse (örneğin,flowWithLifecycleveyacollectLatestkullanı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
}
}