Android ile Retrofit kullanımı ve Volley’den farkı
Bu yazımda genel olarak 2 kavramdan bahsederek 1 api üzerinden bu 2 kavram ile ilgili proje yapacağım. Bu şekilde iki yapının da yazımına aşina olup hangisinin daha avantajlı olduğunu yazının ilerleyen kısımlarında öğrenebileceksiniz.💪
Bu kavramların daha iyi anlamak adına Thread ‘den bahsetmek istiyorum. Thread hakkında ne kadar bilgiye sahip olursanız o kadar iyi!
Bir android uygulama telefon üzerinden ilk defa başlatılmış ise sistem otomatik olarak bir main thread oluşturur ve uygulama kodlarını bu oluşturulan thread içerisinde gerçekleştirir. Retrofit veya Volley gibi bir apiden veri çekme işlemlerinde thread’ dan kaynaklı sıkıntılar çıkabilir. Ne gibi sıkıntılar derseniz: Belli bir süreye sahip işlemler buraya konulursa birbirlerini bekledikleri için uygulamanın donmasından kapanmasına kadar çeşitli durumlara sebebiyet verebilirler. Bu yüzden Main Threadlere yardımcı olacak Worker Threadler kullanılır. Yani veri çekme gibi olayları Main Thread ile değil buna yardımcı olacak Worker Threadler ile hallederiz. (Worker Thread ile Main Thread arasında bir ilişki kurabilmek için biz bu yapıları kullanıyoruz.)
Retrofit ile başlayalım:
Öncelikle Retrofit kullanabilmek için projemize Retrofitin gerekli kütüphanelerini dahil etmeliyiz.
implementation 'com.squareup.retrofit2:retrofit:2.3.0'
Gerekli çevrim işlemlerinin yapılması için ise gson kütüphanesini projeye dahil etmeliyiz.
implementation 'com.squareup.retrofit2:converter-gson:2.3.0'
Manifest’e internet iznini eklliyoruz.
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
Verileri çekmek için linkteki json’ı kullanacağız. Bu apide günlük olarak Nasa’nın Astronomi resimleri paylaşılmaktadır.
👩💻Yazılım geliştirmede kullanılabilecek Api listeleri için tıklayın.
Bu verileri Retrofitte kendi sınıflarımıza dönüştürmeliyiz. Json’ı ayrıştırmak için Gson kullanmalıyız. Bunları el ile yazabiliriz ya da RoboPOJOGenerator, DTO Genereter, GSON format vb. herhangi bir plugini Android Studio’ya dahil edebilir ya da linkteki sayfa gibi online converterlardan birini kullanabilirsiniz. Ben DTO generator pluginini kullandığım için onun üzerinden anlatacağım. Bunun için bir java class açmalıyız.
Açılan converter’a linkteki json dosyamızı yapıştırıyoruz ve bize jsonımızda tanımlı sınıfları oluşturuyor.
Görüldüğü gibi kendi oluşturduğu sınıflara bunu döndürdü.
Şimdi bir Singleton yapısı oluşturmalıyız.
Bu singletonda yapmamız gerekenler şunlar : Eğer Retrofit daha önce oluşturulmamış ise bunu oluşturmak. Daha önce oluşmuş ise return etmek.
Retrofit.Builder() ile Retrofiti oluşturuyoruz. Daha sonra ana url mi belirtiyorum ve .addConverterFactory(GsonConverterFactory.create()) ile jsondan aldığım verilerin nasıl çevrileceğini yazıyorum.
Son olarak build() diyerek oluşturuyorum.
Daha sonra isteklerimizi oluşturacağımız bir İnterface oluşturacağız.
Bu interface şu şekilde çalışıyor:
Bizim oluşturduğumuz BASE_URL sonuna girmemiz gerekenleri yazıyoruz. Bizim Api’ de bir key verdikleri için ve bu key ile istediğimiz verilere ulaşabildiğimiz için Query ile linkimizin sonuna bu key ifadesini giriyoruz bu şekilde çektiğimiz veriler Call ifadesi ile oluşturduğumuz NasaData’ ya aktarıyoruz. Bu key ifadesinin içeriğini ise MainActivity’ de belirteceğiz. Siz burada Nasa api sayfasından kendi aldığınız api keyi girebilirsiniz.
MainActivity’de ise Retrofite sıkıntısız ulaşırsa verileri ekranda göstermesini istiyoruz eğer ulaşamazsa Log.e ile hata mesajı veriyoruz. Bunu nasıl mı yapıyoruz?
Önce Retrofit ile Interface bağlantısını yapmalıyız.
var apiInterface = ApiClient.client?.create(ApiInterface::class.java)
Bu sayede interface içinde bulunan allList( ) fonksiyonuna ulaşabiliriz.
Bu allList( ) fonksiyonu içerisindeki apiKey ifadesinin MainActivity ‘de tanımlanan API_KEY ifadesi ile içini dolduracağız. Bunu da oluşturduğumuz apiInterface ile yapacağız:
var apiCall = apiInterface?.allList(API_KEY)
Bu şekilde bize verilen key ifadesini de linke girmiş olduk.
Şimdi linke hatasız ulaşıp ulaşmadığını anlamak adına onResponse ve onFailure ifadelerini kullanıyoruz. Bunun için oluşturduğumuz apiCall üzerinden enqueue diyerek anonim inner class oluşturuyoruz. Bu sayede onResponse ve onFailure’ e erişebilmiş oluyorum. Bu metotlar veri kaynağına gidip verileri okuyacağım ve bir hata durumunda hataları ele alacağım metotlardır.
Başarılı şekilde verilerin gelip gelmediğini ve linkimizi doğru bir şekilde birleştirip birleştiremediğimizi görmek için şu şekilde bir ifade kullanabiliriz :
override fun onResponse(call: Call<ArtListDat>, response: Response<ArtListDat>) {
Log.e("successful", ""+call?.request()?.url()?.toString())
}
Şimdi aynı Api’ i bir de Volley ile deneyelim
Volleyi projeye dahil etmek için öncelikle kütüphaneyi ekleyelim.
implementation 'com.android.volley:volley:1.1.1'
Manifest’e internet iznini ekliyoruz.
<uses-permission android:name="android.permission.INTERNET"></uses-permission>
Şimdi önce url ve apikey için bir tanımlama yapacağım. Kodların okunurluğunu arttırmak için kotlin class açıp orada tanımlıyorum.
Şimdi MainActivitye gidip isteklerimizi oluşturucak bir RequestQueue oluşturuyoruz.
Görüldüğü gibi çekmek istediğimiz nesne obje formatında olduğu için JsonObjectRequest ifadesini kullandık. Ayrıca NasaUrl classında tanımlamış olduğumuz url ifadesini (yani gitmek istediğimiz linkin genel görünümünü) girmiş olduk. Tıpkı Retrofit de tanımladığımız gibi bize Response.Listener ve Response.ErrorListener oluşturdu. Yani volleye hatasız ulaşıp başarılı şekilde veriler bana geliyorsa response nesnesiyle döndür ifadesini oluşturuyor.
var title = response?.getString("copyright")
ifadeyi şu şekilde kullanarak çektiğimiz api içerisindeki “copyright” i response ile döndürüp Log.e ile yazdırmasını istedik. Bu şekilde verilere kolayca ulaşabildiğimizi gözlemlemiş olduk.
Şimdi Activity içerisinde bulunan ifadeleri doldurarak Nasa verilerini alabildiğimizi gözlemleyelim.
Böylece Volley ve Retrofit arasındaki farkı öğrenmek için ikisini aynı api üzerinden örneklemiş olduk. Bu api ’i kullanarak daha detaylı örnekler yapabilirsiniz.
Son olarak ikisi arasındaki farkları ele alalım :
✍Retrofit kullanılarak GET ile Veri çekmek, POST ile Veri yollamak, DELETE ile Veriyi silmek ve son olarak PUT ile veri göndermek gibi işlemler kolaylıkla yapılabilir.
✍Performans açısından karşılaştıracak olursak en yüksek performansta çalışan Retrofitdir. Arkasından Volley ve AsyncTask gelir
✍Retrofitte çektiğimiz verileri kendi oluşturduğumuz classlara aktarabiliyoruz.
✍Volley de singleton yapısından faydalanılabilir. Tüm uygulama boyunca tek bir kuyruğa sahip olmak için kullanılabilir. Kaç tane isteğimiz olursa olsun tek bir kuyruğa gitsin istiyoruz. Linke tıklayarak burada bulunan kod parçasını kopyalayıp bir class içerisinde direkt olarak olarak dahil edebilirsiniz. Daha sonrasında bu kod parçasını kullanmak için MySingleton. diyerek direkt olarak ulaşabiliriz. Yani az önce ki projede
queue?.add(jsonObjectRequest)
diyerek Volleyi çalıştırmaktansa
MySingleton.getInstance(this)?.addToRequestQueue(jsonObjectRequest)
diyerek çalıştırılabilir.
Retrofit ile daha fazla bilgi sahibi olmak için tıklayınız.
Volley ile daha fazla bilgi sahibi olmak için ise buraya tıklayınız.
Buraya kadar okuduysanız bir alkışınızı alırım :)