Architecture Componentler serisinin 2. yazısı ile beraberiz. Bir önceki yazımda Room kütüphanesinden bahsetmiştim. Bu yazıda ise ViewModel’den bahsetmeye çalışacağım.
Bir activity düşünün ve bu activitye bir şekilde datanızın geldiğini farzedin(örneğin MVP design patterni ile presenterdan verileri buraya geliyor. Bu MVVM de olabilir, hiç farketmez). Kullanıcı cihazı yan çevirdiğinde ne olur? Eğer siz orientation changes için herhangi birşey yapmadıysanız, datalar gider. Yani aslında activity tekrardan çalıştırılmış, onCreate
den başlayarak yaşam döngüsünü tekrardan başlatmıştır. Öncelikle ilk akla gelen çözüm nedir? Verileri tekrar restore edip göstereceğiz. Tabi bu kısım çoğu zaman içinden çıkılamaz hal alıyor ve çok can sıkıcı olabiliyor. İşte bunun için ViewModel
bir çözüm sağlıyor.
Şimdi ViewModel tam olarak nasıl işliyor ona bir bakalım.
ViewModel, verileri UI için tutan ve lifecycle-aware olan bir componentir.

ViewModel lifecycle-aware dedik yani o an hangi lifecycle metodunda ise ondan haberdardır. Dolayısıyla configration change yapıldığında veriler canlı olarak kalır ve etkilenmez.
Yukarıda bir activity başlatıldığında, rotate edildiğinde ve sonlandırıldığından ViewModel nasıl davranır bunu görüyoruz. Yaşam döngüsü activity devam ettiği sürece devam eder sadece activity onDestroy
olduğunda onCleared
metodu çalıştırır.
Artık verileriniz her zaman güncel halini koruyacak.
Kullanım
Öncelikle dependecyleri app/build.gradle
dosyasına alttaki gibi ekliyoruz.
1 2 |
implementation "android.arch.lifecycle:extensions:1.0.0" annotationProcessor "android.arch.lifecycle:compiler:1.0.0" |
Şimdi basit bir şekilde ViewModel kullanımını bir class üzerinde yapalım.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
public class UsersViewModel extends ViewModel { private List<User> userList; public List<User> getUserList() { if (userList == null) { usersList = loadUsers(); } return userList; } private List<User> loadUsers() { // veritabanından, uzak sunucudan veriler burada alınabilir. } } |
Yukarıdaki kod parçacığında userList adında bir listemiz var. Bu listeye verilerin bir şekilde (veritabanından, uzak sunucudan) geldiğini varsayın. ve classı ViewModel
classından extend ediyoruz.
Şimdi bu ViewModeli bir activity üzerinde kullanalım ve listeyi orada çağıralım.
1 2 3 4 5 6 7 8 9 10 11 12 13 |
public class UsersActivity extends AppCompatActivity { @Override protected void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); UsersViewModel usersViewModel = ViewModelProviders.of(this).get(UsersViewModel.class); showUsers(usersViewModel.getUserList()); } } |
Gördüğünüz gibi ViewModelProviders.of()
metodu ile viewmodeli activity içinde tanımlıyoruz ve sonrasında usersViewModel.getUserList()
şeklinde ViewModel içindeki listeyi alıyoruz. İşte bu kadar
NOT: ViewModel ile onSaveInstanceState()
aynı şey değil. Sakın olaki birbirinin yerine kullanmayın. ViewModel sadece orientation changes kısmında verilerin doğru bir şekilde tutulmasını sağlar. Örneğin activity process durdurulduğunda ViewModel verilerin düzgün bir şekilde tutulduğunun garantisini vermez.
https://developer.android.com/topic/libraries/architecture/viewmodel