Anasayfa / Kütüphaneler / Android Volley Kullanımı ve JSON Parse İşlemleri

Android Volley Kullanımı ve JSON Parse İşlemleri

Volley, Android uygulamalarımızda kullandığımız AsyncTask’ın alternatifi olarak ortaya çıkarılan, Google I/O 2013 sunumunda duyurulan bir Network(Http) kütüphanesidir.

Volley kütüphanesi, hazırladığınız bir REST servisi ya da JSON dosyası varsa, servis URL’ine bağlanıp sonucu size daha hızlı bir şekilde döndürür. AsyncTask kullananlar bilir. doInBackground() metodunda ekran işlemleri yapılmazdı ve tasklar bazen diğerinden önce çalışırdı. Activity bittikten sonra AsyncTask kapatılırsa hata alınırdı. Volley ile bu sorunlar ortadan kalkmış oldu. Tüm işlemler asenkron olarak yapıldığı için zaten bu işi yapan AsyncTask’lara da gerek kalmadı.

Volley kütüphanesi, performansı arttırmak için en önemli işlev olarak önbellekleme özelliğini kullanır. Eğer bilgi Cache’de varsa doğrudan sonuç gösterilir. Yoksa yeni bir istek oluşturulur.

Volley kütüphanesinin avantajları :

  • Ağ isteklerinin zamanlamasını otomatik olarak yapar.
  • Cache yapısı olduğundan hızlı işlem yapar. Özellikle resim indirme ve gösterme işlemlerinde disk ya da bellekte cache’leme yapılır.
  • Eş zamanlı olarak çoklu bağlantıya izin verir.
  • İstekleri asenkron olarak işleyebildiği için AsyncTask’taki sorunlar görülmez.
  • AsyncTask’taki gibi karışık ve zorlu kontrollere gerek yoktur.
  • JSON ve resim işlemlerinde güçlü desteği mevcuttur.
  • Yapılan bir istek, istenildiğinde iptal edilebilir. İşi biten istekler otomatik olarak iptal edilir.
  • Büyük boyuttaki veri çekme işlemleri için uygun değildir. Cache sistemi yüksek boyutta veri tutmaya yetmeyecektir.

RequestQueue Sınıfı

Volley bünyesindeki RequestQueue sınıfı, önbelleğe yazma ve önbellekten okuma işlemlerini, istekleri sıraya koyma ve istek sonuçlarını dönme gibi işlemleri yapar. Her ağ isteğinden önce, bu sınıftan bir nesne oluşturulması ve daha sonrasında istenilen bağlantının sağlanması gerekir. Yapılan her isteğin, istekten sonra bu nesneye add() ile eklenmesi gerekir. Böylece istek kuyruğuna isteği eklemiş oluruz ve bu sınıf bizim için kuyruktaki isteklerin yönetimini ve cache’lemelerini yapar. AsyncTask’a göre en önemli avantajı budur.

Her activity için RequestQueue sınıfından nesne oluşturmak yerine, tüm uygulama boyunca tek bir Singleton nesne oluşturup, onun üzerinden kuyruğa ekleme ve çıkarma işlemleri yapılması Google tarafından öneriliyor. Biz uygulamalarımızda Singleton nesne kullanacağız fakat manuel olarak RequestQueue nesnesi oluşturmayı da bilelim. Konunun sonunda UYARI başlığı altında bunun detayları anlatılacaktır.

Yeni Proje Oluşturma

Volley hakkında bilgi verdikten sonra ufaktan proje oluşturalım ve Volley kullanımını görelim.

Proje oluşturduktan sonra ilk olarak build.gradle dosyasında Volley kütüphanesini tanıtıyoruz. Kütüphane ilk çıktığında jar oluşturma işlemini manuel olarak yapıyorduk. Sağolsun maven imdadımıza yetişti.

build.gradle dosyasının tamamı ise şu şekilde olacaktır.

Şimdi ise AppController sınıfını ekleyelim. Bu sınıf, tüm uygulama boyunca isteklerin takibini ve asenkron çalışmasını sağlar.

Activity tabanlı değil de Application tabanlı bu sınıfı kullanmak, uygulamanın yaşam döngüsü boyunca yönetimin tek bir sınıftan ve tek bir RequestQueue nesnesi üzerinden olması amacıyla daha avantajlıdır. Bu şekilde sınıfı yazıp Manifest içinden de tanımını yapacağız.

AsyncTask kullanırken cihaz döndürüldüğünde, Activity tekrar çalıştığı için AsyncTask da tekrar başlatılıyordu. Volley’de ise Application sınıfından türetilen AppController sınıfı üzerinden, yaşam döngüsü boyunca kuyruğa ekleme çıkarma işlemleri yapılır. Konu başında bundan bahsetmiştik.

AppController sınıfı, Application sınıfından türetilir. Konunun sonunda resim indirme işlemi de yapacağımız için getImageLoader() metodunu da ekledik. Siz kullanmayacaksanız kaldırabilirsiniz.

Resim işlemleri için Cache’leme görevini yapacak olan BitMapCache sınıfımızı da ekleyelim. getImageLoader() metodunda bu sınıfı kullanıyoruz.

Daha sonra AndroidManifest.xml dosyasında İnternet izni ekliyoruz. Uygulamada kullanacağımız 3 adet aktiviteyi tanımlıyoruz. Son olarak da application tag’inde name kısmında AppController‘i tanımlıyoruz.

AppController kullanmayıp her istek için RequestQueue kullansaydık bu name tanımını yapmayacaktık.


Giriş Ekranı

activity_main.xml dosyasına 3 adet buton ekleyelim. 1.sinde basit olarak JSON dosyasını okuyup listeye basalım. 2.sinde biraz daha karışık olan JSON dosyasını parse edip sonuçları bir listede gösterelim. Son butonda da Volley ile çekilen resimleri ImageView üzerinde gösterelim.

Bu işlemler yeni Activity üzerinde yapılacak o yüzden her bir buton için yeni bir Activity oluşturacağız ve her tıklamada yeni Activity açacağız.

Bu ekrana bağlı olan ActivityMain.java sınıfımız ise şu şekilde olacaktır.


Markalar Ekranı

Buraya kadar Volley kullanarak bir Http isteği yapmadık. Bundan sonra istek gönderme işlemlerine başlıyoruz. İlk olarak elimizde markaları gösteren bir JSON dosyası olsun ve bu dosyayı çağırarak dönen sonucu bir listede gösterelim.

Önce markalar.json dosyasının içeriğini verelim sonra bunu Volley ile çağırıp dönen sonuçları Parse ederek gösterelim.

Şimdi ActivityMarkalar sınıfını kodlamaya başlayalım.

Burada yapılan işlemleri açıklama satırlarında anlatmaya çalıştım. Yine üzerinden geçelim.

Bir StringRequest nesnesi oluşturduk. İlk parametresi, isteğin tipidir. Biz GET isteğinde bulunduk. Sonraki parametre, bağlanacağımız URL‘dir. Diğer 2 parametre ise başarılı ve başarısız sonuç döndüğünde çalışacak Listener‘lardır.

Sonuç dönerse onResponse() metodu çalışır. Bu metotta dönen JSON değeri parse edilir ve değerler tek tek listeye eklenir. Son olarak liste, ListView‘a adaptör olarak verilir ve ekranda gösterilir.

Eğer dönen JSON değeri, doğrudan bir JSON Array‘i ise StringRequest yerine JsonArrayRequest de kullanabilirsiniz. O zaman Listener’a ait metotlar da değişecektir. JSON Objesi ise JsonObjectRequest sınıfı kullanılabilir. StringRequest ikisini de kapsadığı için ben bunu kullandım.

Bu sınıfa ait xml dosyasını da oluşturalım.

Markaları Göster butonuna tıkladığımızda ekran görüntüsü şu şekilde olacaktır.


Kullanıcılar Ekranı

ActivityKullanicilar.java sınıfında ise biraz daha detaylı bir JSON dosyası okuyacağız ve parse edip ListView’da göstereceğiz.

Öncelikle URL’imizde bulunan JSON dosyasının içeriğini paylaşalım. JSON dosyasında şu bilgiler bulunmaktadır.

Şimdi bu JSON dosyasına Volley ile erişip okuma işlemi yapalım.

Şuan elimde JSON bilgisi dönen bir servis olmadığı için hazır bir JSON dosyasına erişiyorum. Eğer JSON dönen www.mehmetkirazli.com/apis/getusers.php gibi bir servis olsaydı, URL kısmında bunu yazacaktım. Fakat siz test amaçlı olarak :
https://maps.googleapis.com/maps/api/place/textsearch/xml?query=restaurants+in+Sydney&key=API_KEY 
URL’ini test edebilirsiniz. Api key girerek servisten dönen JSON değerini görebilirsiniz.

ActivitiyKulanicilar.java

Genel olarak Markalar sınıfındaki benzer işlemleri yaptık. Parse işlemleri biraz daha karışık oldu. AppController sınıfında addToRequestQueue() metoduna, isteğimizi parametre olarak verdik ve kuyruğa ekledik. Yanında bir de “kullanicilar” metnini verdik. Bunu, isteği iptal etmek istediğimizde kullanacağız ve bu isimle iptal edeceğiz. Bunu kendisi yapıyor fakat örnek olması açısından yazdım. Bu parametreyi yazmak zorunlu değildir.

Burada Markalar sınıfından farklı olarak, dönen JSON’ı parse edip Kullanicilar adında bir model sınıfına ekledik. Kullanicilar sınıfını da verelim.

Kullanicilar Model sınıfı:

Bu model sınıfında en son toString() metodunu override ettik. Çünkü ListView’a bu modele ait listeyi parametre olarak verdiğimizde, her satırda görülmesi istenen metni yazdık. Custom bir Adapter‘e gerek kalmadı.

activity_kullanicilar.xml dosyası :

“Kullanıcıları Göster” butonuna tıkladığımızda ActivityKullanicilar ekranı açılacak ve sonuç alınıp ekrana aşağıdaki gibi bilgiler yazılacak. Tabi bu arada ProgressBar da dönecek ve sonuç döndüğünde progress kapanacak.


POST İSTEĞİ GÖNDERME

Bu zamana kadar örneklerde GET isteği gönderdik.

Satırında da GET isteği gönderdiğimizi belirttik. Hazırladığınız servisin özelliğine göre POST isteği de göndermek isteyebilirsiniz. POST isteklerinde servise parametre gönderirsiniz ve size sonuç döner. URL kısmında ise gönderdiğiniz parametreler yazmaz. GET isteğinde ise bu parametreler yazar. Parametreden kastımız örnek olarak id = 1 gönderirsiniz ve id değeri 1 olan kayıtlar serviste okunur ve sonuç JSON olarak size döner.

Yani GET işleminde URL’de parametreleri yazarız (Örneklerimizde parametre yoktu). POST işleminde ise parametreleri URL’e yazmayız, arkaplanda göndeririz.

Volley ile POST isteği oluşturduğunuzda, her şey aynı sadece StringRequest‘i oluşturduğunuz satırda aşağıdaki gibi ufak bir değişiklik yapıyorsunuz.

Daha sonra da isteğin sonuna parametreleri ekliyorsunuz. Parametre ekleme metodu olan getParams() metodundaki süslü parantezlerin sırasına dikkat ediniz. Çünkü bu bölüm biraz karışık. Kod bloğumuz son olarak şu şekilde olur:

Burada id değeri 2 ye eşit olan kaydı bize getirir. Tabi servisin de buna uygun kontrolleri yapmış olması gerekiyor. Örnek olarak eğer servisimiz PHP ile hazırlanmışsa şu şekilde kontrol olacaktır.

Bunu GET ile yapsaydık urlKullanicilar URL’inin sonunda ?id=2 gibi bir ekleme yapılacaktı ve getParams() olmayacaktı.

Header Ekleme

Eğer POST isteğinize bir Header bilgisi eklemek istiyorsanız, isteğinizi aşağıdaki gibi güncellemeniz gerekmektedir.


ÖNEMLİ BİR UYARI

Konu başında belirtmiştim. Volley isteği oluşturduktan sonra isteği, AppController üzerinden kuyruğa ekliyoruz. Bu işlem şu şekilde de yapılabiliyor fakat önerilmiyor.

İsteği oluşturmadan önce :

Kod bloğu ile bir kuyruk oluşturuluyor. İstek oluşturulduktan sonra da aşağıdaki gibi isteğimiz kuyruğa ekleniyor.

İsteği oluşturduktan sonra :

Eğer uygulamada çokça Volley isteği olacaksa, bu işlemlerin tek bir SingletonClass üzerinden yapılması (AppController) daha doğrudur ve Google da bunu önermektedir. Fakat az sayıda istek olması durumunda manuel olarak her istek için RequestQueue nesnesi de oluşturulabilir. Bu şekilde bir yapı kullanılacaksa, RequestQueue nesnesi, istek yapılmadan önce oluşturulmalıdır.

Resim İşlemleri

Son olarak Volley ile resim bilgisini okuyup ImageView üzerinde gösterim işlemini yapalım. Okunan resim bilgisini Bitmap‘e çevirip ImageView içerisine set edeceğiz.

İlk olarak xml tarafını yazalım. Basit bir ImageView olması yeterli. activity_resimler:

Şimdi de ActivityResimler sınıfını kodlayalım.

Burada resim indirilirken aşağıdaki YÜKLENİYOR resmi ImageView’da gösterilecek.

Eğer resim indirilirken hata alınırsa da ImageView’da aşağıdaki hata resmi gösterilecek. Volley ile bunları ayarlayabilmek iyi oluyor.

Ekran çıktımız ise şu şekilde olacaktır.


Cache Okuma ve Silme

Volley kütüphanesinde Cache mekanizması olduğunu ve bu yüzden hız konusunda avantaj sağladığını söylemiştik. Cache’de tutulan bilgileri görmek, eğer cache boşsa yeni bir istek yapmak isteyebiliriz. Bunun kullanımı ise şu şekildedir.

Daha önce gidilmiş bir URL varsa, Cache‘de tutulan dönüş bilgisini bu şekilde görebiliriz. Debug yapıldığında, cacheBilgisi değişkeninde, henüz istek yapılmadan JSON değeri görülür.

Url’deki JSON bilgisinin değiştiğini düşünürsek, Cache bilgisini silmek için ise aşağıdaki kod kullanılabilir.


İstek İptal Etme

Örneklerde kuyruğa eklerken bir parametre daha eklemiştik hatırlarsanız. Bunu daha sonra istek iptal etmek istediğimizde KEY olarak kullanacağımızı söylemiştik.

Eğer kullanıcıları aldığımız isteği herhangi bir sebeple iptal etmek istersek:

Komutunu kullanmalıyız. Volley bunu bizim için yapıyor fakat bir yerde işleyişe müdahale etmek istediğimizde işimize yarayacaktır.

Volley kütüphanesinin kullanımı bu şekildedir. Uzun bir yazı oldu umarım anlatabilmişimdir.

Geliştiriciler için Volley bir nimettir. En azından AsyncTask belasından kurtulmuş olduk 🙂 Görüşmek üzere…

KAYNAK KODLAR

Mehmet Kirazlı

İstanbul Eyüp'te ikamet ediyorum. Giresun Alucra'lıyım. Bilgisayar Mühendisliği bölümünden 2013 yılında mezun oldum. "Yeni Başlayanlar için Java 8" kitabının yazarıyım. Şu anda özel bir firmada Mobil Yazılım Geliştirme Uzmanı olarak çalışıyorum.

Bir cevap yazın

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