MVVM, Retrofit, Dagger2 kullanılarak Android Uygulama Geliştirme, Bölüm 1(MVVM Architecture)

Ecem Okan
4 min readMar 30, 2020

--

Merhaba, bu makalede Mvvm,Retrofit, Dagger2,RxJava,Glide kullanılarak nasıl android uygulama geliştirileceğinden bahsedeceğim. Uygulamayı test etmek , kararlı ve sağlam hale getirmek için birim test yazacağım.

Uygulamamızda adım adım ilerleyeceğiz. Birkaç aşamadan oluşacak olan makalede yolumuz şu şekilde olacak.

Bölüm 1 : MVVM Architecture
Bölüm 2 : Retrofit
Bölüm 3 : Dependency Injection
Bölüm 4 : Unit Testing

GitHub Developer REST API V3 kullanarak, kullanıcıların fotoğraflarının, kullanıcı isimlerinin, github adreslerinin bir listesini oluşturacağız.

https://developer.github.com/v3/users/

İşlevsellik açısından basit bir uygulamadır. Ancak basit bir uygulamada bu bahsi geçen teknolojilerin nasıl kullanılacağını göstereceğim.

BÖLÜM 1 : MVVM Architecture

Model-View-ViewModel yapısı 3 kısımdan oluşur.

Model: Uygulamanın verilerini içerir. ViewModel ve View, bu verileri kullanır. View ile iletişime geçer ve genellikle gerekli veriyi ViewModel’e gönderir.

View: Uygulamanın kullanıcı arayüzünü temsil eder. (UI : User Interface)
Kullanıcı hareketlerini ViewModel’e gönderir. Bu nedenle MVVM deseni View ve ViewModel arasında iki yönlü veri bağlanmasını destekler.

ViewModel : Kullanıcı arabirimi ile ilgili verileri yaşam döngüsü bilinciyle depolamak ve yönetmek için tasarlanmış bir sınıftır.

Uygulamamızı yazarken bu yapıyı detaylıca inceleyeceğiz. Mvvm’in tanımından kısaca bahsettikten sonra projemize başlayabiliriz.

Lambda ifadelerini kullanabilmemiz için Java 8 dil özelliği desteği gereklidir. build.gradle dosyamızı yapılandırarak bu dil desteğini projemize ekleyebiliriz.

Ardından yine build.gradle dosyamızın içerisinde gerekli kütüphaneleri tanımlayalım.

Projemizin MVVM mimarisine uyması için; model, view ve viewmodel adında üç tane package oluşturmamız gerekiyor. Şimdilik di isimli package kafanızı karıştırmasın daha sonraki bölümlerde Dependency Injection(di) adlı package’tan da bahsedeceğiz.

model package’ımıza UserModel isimli bir sınıf ekliyoruz. Eklediğimiz bu sınıf içerisinde kullanıcı arayüzünde gerekli olan verileri içerecek.

login, htmlUrl, avatarUrl isimli üç adet String tanımlıyoruz. Tanımladığımız bu stringlerden login github kullanıcı ismini, htmlUrl kullanıcının github adresinin linkini, avatarUrl ise kullanıcının profil fotoğrafının bulunduğu linki tutmaktadır.

viewmodel package’ımıza ListViewModel isimli bir sınıf ekliyoruz. Fakat bu sınıfı yazmadan önce size biraz Android Architecture Components in önemli bir bileşeni olan LiveData dan bahsedeceğim.

Livedata temel olarak datadaki değişiklikleri izlememizi sağlayan observable bir data holderdır. Data değişikliklerindeki bizi notify eder, böylece ui’ı değiştirebiliriz. Livedata abstract class’dır, extend edebilir ya da MutableLiveData’yı kullanabiliriz.

LiveData LifeCycle aware bir componentdir. Aslında en önemli özelliği de burada karşımıza çıkıyor.

Livedata activity’nizin ekranda mı, değil mi yoksa tamamen destroy mu olduğunu bilir ve updateleri buna göre gönderir. Bunun için ise iki interface vardır. Biri lifecycle owners, activity’ler, fragmentler; diğeri ise livecycle observers, livecycle owner’ı izleyip, lifecycle observersları notifiy eder. UI componentleri LiveData’yı, LiveData da LifeCycleOwner’ları observe eder.

Componentlerimiz Activity, Fragment’in state’lerinden haberdar ancak, örneğin her konfigürasyon değişikliğinde, telefonu rotate ettiğimizde de yeniden LiveData’nın create olmaması datayı koruması gerekir. Bunu da ViewModel‘le yapıyoruz. Bunun için de Activity’imiz için gerekli olan tüm datayı tutacağımız bir class yaratıp bunu ViewModel’den extends etmemiz gerekir.

Makalenin sonunda sizinle Android Lifecycle-Aware components ile ilgili bir makale linkini de paylaşacağım.

Konumuza tekrar dönelim. ListViewModel ismi ile bir sınıf oluşturmuştuk ve bu sınıfı ViewModel’den extend ettik.

Retrofit konusuna ikinci bölümde değineceğimiz için şimdilik UserModel’imizi bu veriler ile dolduralım.

activity_main ve item_user ile ilgili arayüzlere çok fazla değinmeyeceğim.

activity_main.xml
item_user.xml

view package’ımıza UserListAdapter isimli bir sınıf ekliyoruz. RecyclerView ‘ımızı bu sınıfımız ile dolduruyoruz.

UserListAdapter.java

Bu sınıfımız içerisinde yeri gelmişken size biraz ButterKnife’tan da bahsetmek istiyorum. ButterKnife bir View Injector kütüphanesidir. Bir başka deyişle, önyüzde tanımladığımız view bileşenlerini, annotation’lar kullanarak projemize dâhil etmemize olanak sağlıyor. Sadece view’leri değil, aynı zamanda projemizde kullandığımız String, Drawable, Color ve Dimen gibi kaynakları da aynı yöntemle pratik bir şekilde projemize ekleyip bizi kod tekrarı yapmaktan kurtarıyor. Bu sınıf içerisinde ImageView, TextView’ler için ButterKnife kullanılmıştır.

ButterKnife ile ilgili detaylı makalelerin linkini yazının sonunda paylaşacağım.

Son aşamada sadece MainActivity sınıfını düzenlememiz kaldı.

MainActivity.java

Ve makalemizin ilk aşaması olan MVVM Architecture kısmını tamamladık. Projenin bu aşamaya kadar olan ilgili kaynak kodu aşağıdaki linktedir.

Uygulamamızın devamı niteliğinde olacak olan Bölüm 2 : Retrofit makalesi en yakın zamanda sizlerle olacak.

Bir sonraki yazıda görüşünceye dek kendinize dikkat edin.

--

--