Android Architecture Components: LiveData

Architecture Componentler serisine LiveData ile devam ediyoruz. Önceki yazılarımda diğer 2 componentten (ViewModel, Room) bahsettim. Bu yazıya başlamadan önce eğer ViewModel ile ilgili yazıyı okumadıysanız onu okumanızı öneririm. Çünkü bu yazıda onun üzerine koyarak ilerleyeceğiz.

Öncelikle ViewModel ile yaptığımız örneği bir hatırlayalım.

ViewModel sayesinde configration changes olsa bile dataları kaybetmeden tutabiliyorduk. Peki şöyle bir soru sorayım. Aldığımız verileri sürekli güncel olarak tutmak istesek? Yani bir değişiklik olduğunda UI direk olarak güncellense? İşte bu LiveData ile mümkün.

LiveData, observer design patterne sahip lifecycle-aware bir componenttir.

LiveData ile tuttuğumuz verilerimiz olsun. Mesela bunu üstteki örnekte usersList olarak düşünebilirsiniz. Bir de verilerde değişiklik olduğunda gözlem yapabileceğimiz Activity ya da Fragment olsun – ki bunlara LifecycleOwner diyeceğiz –

LifeCycleOwner’da verilerde her seferinde değişiklik olup olmadığını gözlemlemek için ViewModel içinde tutacağımız LiveData objelerini gözlemleyeceğiz ve bu sayede UI her zaman güncel kalacak.

Kullanım

İlk olarak her zaman yaptığımız gibi dependency leri app/build.gradle içine ekliyoruz.

ViewModel ile yaptığımız örneği LiveData kullanarak güncelleyelim.

Üstte gördüğünüz gibi List<User> ‘ı MutableLiveData ile sarmaladık. Bu şekilde her değişiklik olduğunda (örneğin veriler veritabanında değiştirilmiş olabilir ya da uzak sunucudan veriler sağlanıyor olabilir) UI haberdar edilecek. postValue() metodu kullarak asenkron bir şekilde verilerin LiveData’ya post edilmesini sağladık. Eğer senkron bir şekilde olsun istiyorsanız bu sefer setValue() metodunu kullanmalısınız.

Sonrasında Activity dosyamızı güncelleyelim.

ViewModel içinde tanımladığımız LiveData’yı gözlemlemeye observe() metodu ile başlıyoruz. Bu metod 2 parametre alıyor. İlki LifecycleOwner, activity üzerinde çalıştığımız için LifecycleOwner bu activity oluyor. Dolayısıyla thisdiyoruz. 2. parametrede de bir callback metod yer alıyor buraya veriler List<User> şeklinde geliyor. Biz showUsersmetodu ile bunu aldık. İşte bu kadar. LiveData sayesinde artık UI her zaman güncel kalacak.


Şimdi de LiveData ile daha neler yapabiliriz kısaca ona da bakalım.

Örneğin yukarıda bize gelen userList nesnesinde sadece belirli bir kısım verileri almak istersek bunun için Transformations.map()metodu ile yapabiliriz. Kullanıcı isimlerini döndüren ve String bir listeye atayan metodu alttaki gibi yazabiliriz.

İki farklı LiveData objesini MediatorLiveDatakullanarak birleştirebiliriz.

usersLiveData objesini dinleyerek 2 farklı kaynaktan gelen verilerin birleştirilmiş halini alabiliriz

Room ile kullanımı

LiveData, Room ile birlikte çalışabilme özelliğine sahiptir. Bu sayede veritabanında bir değişiklik olduğunda UI direk olarak güncellenmiş olur.

Gördüğünüz gibi üstte Dao arayüzünde yazdığımız queryden dönen sonuçlar direk olarak LiveData’da saklanacak bu sayede LifecycleOwner değişikliklerden her zaman haberdar olacak.

https://developer.android.com/topic/libraries/architecture/livedata

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

This site uses Akismet to reduce spam. Learn how your comment data is processed.