ViewModel Scope'ta Bellek Sızıntısı: Android'de Gözden Kaçan Hatalar

Android'de ViewModel kullanırken çoğu geliştirici lifecycle'ı doğru anladığını düşünüyor. Ama pratikte, özellikle scope yönetiminde basit ama pahalı hatalar yapılıyor.

ViewModelScopeFactory ile çalışırken en sık sorun, repository veya API client'ın ViewModel içinde yaşama alması. Örneğin bir Activity'de ViewModel oluştururken, o ViewModel'in içinde singleton olmayan bir repository tutarsanız, Activity yok olsa da ViewModel bellekte kalabilir. Neden? Çünkü ViewModelStore, Activity destroy olana kadar ViewModeli tutmaya devam eder ve eğer ViewModel'in içindeki referanslar döngüsel ise, garbage collector onları temizleyemez.

Diğer yaygın hata: LiveData observer'ları unsubscribe etmemek. Bir Fragment'tan Activity'deki ViewModel'i observe ederken, Fragment'ın onDestroyView'ında observer'ı kaldırmazsanız, Fragment yok olsa da ViewModel'in observer listesinde kalır. Bu, Fragment'ın context'ini canlı tutar ve bellek sızıntısına yol açar.

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

Scope sorununun kökü aslında şu: ViewModelStore, Activity veya Fragment'ın lifecycle'ına bağlıdır. Ama ViewModel'in içindeki nesneler bundan bağımsız olabilir. Bir Coroutine Job'u ViewModel'de başlatıp hiç cancel etmezseniz, Activity destroy olduktan sonra da çalışmaya devam eder. Bu sadece bellek değil, CPU da tüketir.

Doğru yaklaşım: ViewModel'i hafif tutun. Ağır nesneleri (database, API client) dependency injection ile dışarıdan al. LiveData observer'larını lifecycle-aware yapın veya Fragment'ın onDestroyView'ında manual olarak kaldırın. Coroutine'ler için viewModelScope kullanın, bu, ViewModel destroy olduğunda otomatik olarak tüm Job'ları iptal eder.

Android Jetpack kütüphaneleri bu sorunları azaltmak için tasarlandı ama kütüphane kullanmak yeterli değil. Scope'un ne olduğunu, lifecycle'ın ne zaman başladığını ve bittiğini bilmek gerekir. Aksi halde, hızlı görünen kod sessiz sedasız belleği yiyor.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz