LiveData Nedir?
Selamlar 👋, gelelim LiveData’ya. Ne gibi türlerinin olduğu, ne zaman kullanılması gerektiği,.. gibi başlıkları ele aldığım bir yazı hazırladım. Başlayalım o halde.
LiveData’nın ne olduğuna bakmadan önce Observer design pattern’nin kısaca ne olduğuna bakalım birlikte.
Observer Design Pattern: Bir nesnede meydana gelen bir değişiklik sonucu bu nesneye bağlı olan diğer yapıların bilgilendirilmesini sağlayan pattern’dir.
🔹 LiveData Nedir?
- Gözlemlenebilir bir veri tutucu sınıftır. Bir fonksiyon ya da değişkende oluşabilecek değişimi gözlemleyip bu değişimden etkilenmesini istediğimiz yapıların tetiklenmesi sağlanır.
- Lifecycle aware’dir. Yani activity, fragment,.. gibi bileşenlerin yaşam döngüsüne göre hareket edebilmektedir.
- Livedata, aktif bir yaşam döngüsü varsa verileri gözlemler. Çünkü veriler uygulama etkin iken değiştirebilmektedir.
- STARTED ya da RESUME durumları aktif yaşam döngüsü olarak kabul edilmektedir.
- Activity ya da fragment’ta LiveData’yı gözlemleyen bir Observer varsa activity ya da fragment destroy olduğu zaman bu değişikliği gözlemleyen yapıda ortadan kalkar.
- LiveData ile View’leri güncelleyebiliriz.
- LiveData, UI ile ViewModel arasındaki iletişimi sağlar.
- LiveData nesnesi genelde ViewModel içerisinde oluşturulur.
🔹 Avantajları Nelerdir?
- UI ile veri durumunun eşleşmesini sağlar.
LiveData, nesneler değiştiğinde observer nesnelerini bilgilendirir. UI, observer ile güncellenebilir. Bu sayede uygulamadaki veriler değiştiği zaman UI’yı güncellememiz gerekmez. Observer bunu bizim yerimize yapar.
- Memory leak olmaz
Observer’lar yaşam döngüsü nesnelerine bağlı olduklarından dolayı yaşam döngüsü yok edildiğinde kendileri otomatik olarak arkalarını temizler.
- Durdurulan activity’ler crash’e neden olmaz
Activity eğer inaktif bir durumdaysa herhangi bir LiveData event’i almaz.
- Manuel lifecycle yönetimi yok
UI bileşenleri sadece ilgili verileri gözlemler. Gözlemi durdurmaz ya da devam ettirmez. LiveData, gözlem yaparken ilgili yaşam döngüsü yapılan değişikliklerin farkında olduğundan tüm bunları otomatik olarak yönetir.
- Her zaman güncel veriler vardır
Bir lifecycle devre dışı bırakılıp yeniden aktif hale getirilirse en son veriler alınır.
- Uygun configuration değişiklikleri
Cihaz ekranını döndürme gibi bir configuration değişikliği sonucu activity ya da fragment yeniden oluşturulursa, en son veriler alınır.
- Kaynak paylaşımı
🔹 Projede Nasıl Kullanabiliriz?
- ViewModel içerisinde LiveData nesnesini oluşturmamız gerekir. (Genelde ViewModel içerisinde gerçekleşir.)
- Kullanılan Livedata türü MutableLiveData ise, setValue() ya da postValue() ile değişiklikler yapılır.
- Activity ya da fragment içerisinde LiveData döndürülerek observe yöntemi ile veriler gözlemlenir.
dependency:
implementation "androidx.lifecycle:lifecycle-livedata-ktx:2.5.1"
(Android’in kendi sitesindeki örnek baz alınmıştır 👇)
- LiveData oluşturma:
- Observe LiveData:
- LiveData nesnesini güncelleme:
🔹 LiveData Türleri
- LiveData
- MutableLiveData
- MediatorLiveData
- MutableLiveData: LiveData’nın bir alt sınıfıdır. MutableLiveData, setValue() ve postValue() yöntemlerini kullanarak veri/veriler üzerinde değişiklik yapabilmektedir.
Arka planda nasıl tutulduğuna baktığımızda bu metotları da görmekteyiz.
- MediatorLiveData: LiveData nesnelerini gözlemleyebilir ve onChange event’lerine tepki verebilir. MediatorLiveData’yı özellikle bir eylemi ne zaman gerçekleştirmek istediğimiz ya da bir olayı ne zaman yaymak istediğimiz ile ilgilenir ve bu gibi durumlarda kullanılır.
setValue(): Verilen değeri güncellemede kullanılır. Bu metot main thread’de çağrılmalıdır.
postValue(): Verilen değeri ayarlamak için bir görev gönderir. Eğer birden fazla kez bu metot çağrılırsa yalnızca son değer gönderilir.
Bunların dışında LiveData sınıfı genişletilirken aşağıdaki metotlarda kullanılmaktadır.
- onActive() : LiveData nesnesinin aktif bir observer’a sahip olduğunda çağrılır. Bu da observer’ın lifecycle’nın STARTED ya da RESUMED durumunda olduğunu gösterir.
- onInactive() : LiveData nesnesinde aktif bir observer olmadığında çağrılır.
LiveData türlerinden birbirleriyle karşılaştırılan LiveData ve MutableLiveData’yı ele alacak olursak:
🔹 LiveData vs MutableLiveData
- MutableLiveData ile verilerin değerleri değiştirilebilirken LiveData’da değiştirilmez.
- MutableLiveData, LiveData’nın genişletilmişidir. setValue() ve postValue() gibi metotlar sağlar.
- Kısaca LiveData ile verileri gözlemleyebilirken, MutableLiveData ile bu veriler üzerinde değişiklikler yapabilmekteyiz.
🔹 LiveData vs Flow
- LiveData lifecycle aware’dir. Ancak Flow değildir.
- LiveData verileri gözlemlemek, lifecycle problemlerini ele almada kullanılırken Flow ise asenkron programlamayı basitleştirme ve veri entegrasyonunda kullanılır.
- Flow’da, LiveData’da olmayan birden çok operatör bulunmaktadır.
Flow’un ne olduğunu bilmiyorsanız bu konuda yazdığım yazıyı inceleyebilirsiniz. 👇
Kaynak
- https://developer.android.com/topic/libraries/architecture/livedata
- https://developer.android.com/reference/androidx/lifecycle/MutableLiveData#setValue(T)
- https://blog.mindorks.com/understanding-livedata-in-android/
- https://www.innominds.com/blog/introduction-to-livedata-in-android
- https://medium.com/android-news/exploring-livedata-architecture-component-f9375d3644ee
- https://halil-ozcan.medium.com/android-livedata-kullan%C4%B1m%C4%B1-901bc3ad2ed5
- https://kiliccambaz.medium.com/kotlin-livedata-kullan%C4%B1m%C4%B1-f30faaa857a2#:~:text=LiveData%20Nedir%3F,ya%C5%9Fam%20d%C3%B6ng%C3%BClerine%20kar%C5%9F%C4%B1l%C4%B1k%20hareket%20edebilir.
- https://medium.com/@sensesaysee/android-livedata-viewmodel-48877cd900d7
- https://fucukur.medium.com/android-architecture-component-da-kotlin-ve-livedata-dbbea2229676
gif url: The End Goodbye GIF — Find & Share on GIPHY (2022). Available at: https://giphy.com/gifs/the-end-gif-KINAUcarXNxWE