Android Kotlin Retrofit 2 Kurulumu ve HTTP Request MVVM -1
Herkese merhaba ! Bu yazımda Android’de Kotlin ile Retrofit kullanarak GET Request nasıl yapılır onu anlatacağım. Kodun düzenli görünmesi ve geliştirmeye daha açık olması için MVVM Mimarisi ile yazmaya özen gösterdim. Yapacağımız HTTP isteği Main Thread’i bloklamaması için Coroutine kullandım.
Öncelikle boş bir proje oluşturuyoruz. Daha sonra Projemiz için gerekli dependencyleri build.gradle (Module: app) dosyamıza ekliyoruz.
Bu eklemeleri yaptıktan sonra sağ yukarıda çıkan ‘Sync now’ butonuna basıyoruz ve Android Studio’nun gerekli dosyaları bizim için projeye dahil etmesini bekliyoruz.
Projenin daha okunaklı olması ve daha düzenli görünmesi için packagelara ayırmalıyız.
İnternetten veri çekebilmemiz için öncelikle elimizde JSON formatında verilerin bulunması gerekli. Biz burada JSONPlaceholder’ın bizim için oluşturduğu verileri kullanacağız. Aşağıda bulunan linkten ulaşabilirsiniz.
Bu verileri uygulama içerisinde tutmak ve daha kolay ayırt etmek için Model sınıfına ihtiyacımız var. JSON dosyasında görünen verileri model sınıfına dönüştürmek için Android Studio’nun Plugini bulunmakta. Bu Plugini eklemek için File > Settings > Plugins > Marketplase sekmesine geliyoruz ve arama kısmına JSON To Kotlin yazıyoruz. Çıkan eklentiyi kuruyoruz ve Android Studio’yu yeniden başlatıyoruz.
Projenin düzenli olması için packagelara ayıracağımız söylemiştik. Model sınıflarının bulunacağı models isimli bir package oluşturuyoruz. Daah sonra bu package a sağ tıklıyoruz ve oradan New sekmesine geliyoruz. Burada Kotlin data class File from JSON’ı seçiyoruz.
Daha sonra karşımıza çıkan ekrana yukarıda linkini vermiş olduğum JSON dosyasının tamamını kopyalayıp yapıştırıoyruz ve Class Name kısmına User yazıyoru ve Generate butonuna . Bu bizim ana sınıfımızın ismi olacak.
Bu işlemin sonucunda model packageı aşağıdaki gibi görünmeli.
Bu sınıfları inceleyip JSON dosyası ile karılaştırırsanız biraz daha iyi anlarsınız.
Model sınıfını oluşturduk. Sırada HTTP Request yapacak olan Retrofitin bir örneğini oluşturmalıyız. Öncelikle Retrofite bu isteğin hangi URL den yapılacağını bildirmeliyiz. Proje içerisinde kullanacğımız değeri sabit olan değişkenleri farklı bir sınıfta tutalım ki daha düzenli görünsün. Değiştirmek istediğimizde daha kolay ulaşabilelim. Bunu için utils isimli bir package oluşturuyoruz ve içerisine Constants isimli bir Object Class oluşturuyoruz. Bu sınıf aşağıdaki gibi olmalı.
Base Url olarak sadece uzantıya kadar olan kısmı aldık. Kalan kısmı Api’de tanımlayacağız.
Şimdi sıra verileri çekmemize yardımcı olacak olan Retrofit Servisini kurmaya geldi. Bunun için service isimli package oluşturuyoruz.
Öncelikle RetrofitApi isimli interfacemizi yazalım. İçerisinde Gövdesiz fonksiyonlar olacağı için interface tanımladık. Burada 1 adet fonksiyon bulunacak ve geriye User veri tipinde değer dönderecek. Daha doğrusu HTPP Request yapacak.
Burada bulunan @GET notasyonu içerisine Base Url kısmından sonraki kısmı yazıyoruz.
Requesti yapabilmek için Retrofiti kurmalıyız. Bunun için RetrofitInstance isimli abstract bir sınıf oluşturuyoruz. Bu sınıftan nesne üretmeyeceğimiz için abstract yaptık.
Yapacağımız işlemleri companion object tagları arasında yapacağız. Bu kavram Java’da static kavramına denk gelmektedir. Öncelike Retrofiti kuruyoruz daha sonra da RetrofitApi içerisinde oluşturduğumuz fonskiyonu çağırabilmek için retrofitInstance oluşturuyoruz.
Sırada verileri çekmek için kullanacağımız sınıfı oluşturmaya geldi. Öncelikle viewmodels isimli bir package açıyoruz ve içerisine UserViewModel isimli bir class oluşturuyoruz.
Bu sınıf içerisine getData() isimli bir fonksiyon tanımlıyoruz. Bu fonksiyon kurmuş oluğumuz retrofit ile verdiğimiz Url’yi kullanarak oradaki verileri bize getirecek ve _users isimli değişkenin içerisine koyacak. _users değişkeni private olduğu için diğer sınıflardan erişilemez. Bu sebeple private olmayan farklı bir dğeişken tanımladık ve bu değişken de _users değişkeninin verisini diğer sınıflardan gözlemlememizi sağlayacak.
Tüm bu sınıfları tanımladık fakat hala MainActivity içerisinde bir değişiklik yapmadık. Uygulamayı çalıştırsak da birşey göremeyeceğiz. Tanımlamış olduğumuz ViewModel sınıfındaki fonksiyonu çağırmak için MainActivity sınıfını açıyoruz.
Öncelikle UserViewMode tipinde viewModel nesnemizi tanımlıyoruz ve atamasını yapıyoruz. getData() fonksiyonunu CoroutineScope içerisinde yapmamızın sebebi bu Request işleminin MainThread’i engellemesini engellemek için. ViewModel içerisinde bulunan users değişkenini observe ediyoruz yani gözlemliyoruz. Bunun anlamı, biz UserViewModel içerisinde buluna getData() fonksiyonunu çağırdığımızda Retrofitin dönderdiği JSON dosyası _users değişkenine atılacak ve users değişkeni de _users değişkeninin değerini aldığı için onun da değeri değişecek. Değişim olduğunda observe fonksiyonu çalışcak ve çektiğimiz JSON verisini userList olarak dönecek. Bu kaydı log ekranında görmek için 16. satırdaki kodu yazdık.
İnternetten veri çekeceğimiz için AndroidManifest dosyasının içine INTERNET Permission’u tanımlamamız gerekli. Bunun için application tagının hemen üzerine bu kodu yapıştırıyoruz.
Daha sonra uygulamayı çalıştırıyoruz ve verilerin log ekranına düştüğünü görüyoruz.
Eğer bunun yerine hata alırsanız Emülatörden uygulamayı silip tekrar çalıştırın. Hala hata alırsanız projeyi Build > Rebuild Project diyerek tekrar build edebilirsiniz.
Proje sonunda package yapımız aşağıdaki gibi olmalı.
NOT: Hata almamak için kodu yazarken importları doğru yapmalısınız.
Bu yazım bu kadar. Diğer yazımda aldığımız verileri RecyclerView’da göstereceğiz.
Projede kullandığımız kavramlar hakkında daha fazla bilgi edinmek için aşağıda bıraktığım linkleri takip edebilirsiniz.
1- https://square.github.io/retrofit/
2- https://developer.android.com/topic/libraries/architecture/viewmodel
3- https://developer.android.com/jetpack/androidx/releases/lifecycle
4- https://developer.android.com/topic/libraries/architecture/livedata
5- https://kotlinlang.org/docs/reference/coroutines-overview.html