Android Volley

Volley android için geliştirilmiş Networking kütüphanesi. Networking kütüphanesi diyorum çünkü network üzerinden yapmak isteyebileceğiniz hemen herşeyi yapabiliyor. Yapabileceklerinin başında ise URL üzerinden resim indermek ve REST servislere bağlanmak geliyor.

Aktif iş hayatımda Java EE uygulamaları geliştiriyor olsam bile, boş zamanlarımda ufak Freelance işleri alarak Android uygulamaları geliştiriyorum. Android konusunda uzman olduğumu söyleyemem ama bu kütüphaneyi gördüğümde vuruldum. En son projemde ağırlıklı olarak resim indirilen bir uygulama geliştiriyordum. Okadar ki hemen hemen her menüde, listede ya da sayfada resim indirmem gerekiyordu. Her ne kadar AsyncTask’lar ile işimi hallediyor olasam da bu durum hiç mi hiç içime sinmiyordu.  Her sayfa yüklenirken bir loading gösterip arka tarafta resimleri çekmek zaten ne kadar güzel olabilir ki.

Bende bu rahatsızlığımı gidermek için ve birazda merakla açık kaynak android projelerini incelemeye başladım. Proje proje gezerken Google IO 2013 için geliştirilmiş mobile projesinde Volley diye bir kütüphane kullandıklarını gördüm. Nedir ne değildir diye araştırırken Google IO 2013’teki sunumu izledim ve aradığım kütüphanenin bu olduğunu anladım.

Volley

Volley networking kütüphanesi. İlk başta aklıma gelen temel yetenekleri şu şekilde,

  • HTTP üzerinden resimlerinizi indirebilirsiniz. Hatta indirdiğiniz resimleri bellekte ya da disk üzerinde cache’leyebilirsiniz. Resimleriniz inerken, ImageView içerisinde otomatik olarak bir “loading” simgesi gösterebilir hatta hata durumları için (404 vs) resim atayabilirsiniz.
  • REST servislerinize bağlanabilir ve kendi yazacağınız çeviricilerle JSON ya da XML cevaplarını otomatik olarak istediğiniz sınıflara çevirebilirsiniz.
  • Tüm networking işlemlerini belirli bir sırada yaptığı gibi, mutithread yapıda çalışmaktadır.
  • İstekleri kuyruk yapısında tutar ve eğer isteğin cevabına artık ihtiyaç kalmadıysa otomatik olarak isteği iptal eder. (İsteğin yapıldığı activity’nin sonlanması gibi durumlarda isteği otomatik olarak iptal eder.)
  • Ve tüm herşeyi aktif olan Thread’i bloklamadan yapar.

Kısaca aklıma gelen yapılar bunlar. Daha detay ve örnek isterseniz sunumu incelemenizi tavsiye ederim.

Volley.jar

Öncelikle Volley.jar’ı nasıl elde edebileceğinize bakalım. Ne yazıkki ben bu yazıyı yazdığım sıralarda bir maven respository’sinde volley.jar kütüphanesini bulamadım. Bundan dolayı volley kütüphanesini kendizin indirip JAR’laması gerekmektedir. Bunu anlatırken Android SDK’nızın kurulu olduğunu, ANDROID_HOME sistem değişkeninizin tanımlı olduğunu ve ANDROID_HOME\tools klasörünüzün sistem PATH’nize ekli olduğunu varsayıyorum. Ayrıca ANT geliştirme aracınızın da kurulu olduğunu varsayıyorum.

Son olarak JAR oluşturmaya başlamadan önce GIT istemcinizin bulunması gerekmektedir. Eğer daha önce GIT istemcisi kurmadıysanız bu adresten indirip kurabilirsiniz.

Artık aşağıdaki komutları takip ederek JAR dosyanızı oluşturabilirsiniz.

  • git clone https://android.googlesource.com/platform/frameworks/volley
  • cd volley
  • android update project -p .
  • ant jar

Bu işlemleri yaptıktan sonra bin klasörünün altında volley.jar dosyanızın oluşmuş olması gerekmekedir. Eğer bir hata ile karşılaştıysanız adımlarınızı ve araçlarınızı kontrol edip tekrar deneyin. Bu arada özellikle üçüncü adıma dikkat etmenizi istiyorum orada bir nokta işareti var. Komutun düzgün çalışması için nokta işaretini atlamamanız gerekmektedir.

Örnek Volley Uygulaması

Burdan sonra örnek bir volley uygulaması yapabiliriz. Ben örneğimi Eclipse ADT üzerinden yapacağım. Sizede aynısını kullanmanızı öneririm.

İlk olarak Android Application Project yaratıyoruz. Yaratırken aşağıdaki değerleri kullanıyorum.

  • Application Name: VolleyTutorial
  • Project Name:   VolleyTutorial
  • Package Name:  com.bahadirakin.volley
  • Minimum Required SDK: API 8
  • Target SDK: API 18
  • Compile With: API 18
  • Theme: None

Burdan sonra geri kalan tüm değerleri Default’ta bırakıyorum. Arzu ettiğinizi değiştirebilirsiniz. Bu şekilde projeyi yarattığımda bana içerisinde MainActivity.java olan bir proje yaratıyor. Burada bir dakika duralım ve Volley kütüphanesini projemize ekleyelim.

Bunun için az önce oluşturduğumuz Volley.jar kütüphanesini projemizin libs klasörüne atıyoruz. Eğer jar olarak oluşturamadıysanız proje olarak eclipse’ ekleyipte kullanabilirsiniz.

RequestQueue ve ImageLoader

Yazımızın başında Volley uygulamasının, http isteklerini kuyruk yapısı üzerinden gönderdiğinden bahsetmiştik. Genel olarak bu kuyruk yapısının sistemde bir tane olması gerekmektedir. Tüm http requestleri tabi bunlara yüklenecek resimlerde dahil olmak üzere bu sınıf üzeirnden gönderilecek. Bunun için Singleton yapıda bir sınıf yaratmamız gerekecek. Bunun için com.bahadirakin.volley paketinin altına VolleyApplication isminde Singleton bir sınıf yaratıyoruz.

VolleyApplicaiton.java

Bu sınıfı kullanmadan önce “init” methodunun çağrılması ve içerisinde Andorid Context’inin gönderilmesi gerekiyor. Bu işlemin bir kere yapılması yeterli olacaktır. Ben tercihen SplashScreen’te bu işlmi gerçekleştiriyorum. Ama bu seferlik bu işlemi MainActivity sınıfının içerisinde yapacağım.

Burada işaretli olan satıra dikkar ederseniz BitmapLruCache sınıfının kullanıldığını göreceksiniz. Bu sınıfı daha yazmadığımızdan hata verecektir. Kabaca bu sınıf bize yüklenen resimlerin cache’lenmesinde yardımcı olarak. Adından da alyacağınız üzere LRU tekniğiyle cache’leme yapacak ve belliğin sekizde birini kullanacak. Sınıfın detayına aşağıdan ulaşabilirsiniz.

BitmapLruCache.java

Image Lazy Loading

Volley kısmını projeye eklemeyi bitirdik. Şimdi lazy load yapacağımız resim alanını MainActivity sınıfına ekleyim. Ve lazy load işlemini gerçekleştirelim.

HTTP üzerinden yükleyeceğimiz resim adresi: http://www.bahadirakin.com/wp-content/uploads/2013/10/android_volley.png

Resim yüklenene kadar göstereceğimiz resim: loading.png Bu resmi indirip projenizin res/drawable-mdpi klasörüne yüklemenizi istiyorum.

Resim yükleme sırasında hata çıkarsa göstereceğimiz resim: error.png  Bu resmide indirip aynı yere kaydetmenizi istiyorum.

Resim indireceğiz bunun için andorid uygulamamızın izinlerini ayarlamamız gerekiyor. AndroidManifest.xml dosyasına aşağıdaki satırları eklemeniz yeterli olacaktır.

AndroidManifest.xml

ImageView yapsınızı MainActivty’e ekledikten sorna xml dosyası aşağıdaki gibi olacaktır.

activity_main.xml

Sayfamızın onCreate adımında ise resmi yüklüyoruz. Bu sizi şaşırta bilir ama bu işlem sayfanızı kitlemeyecektir. Yazının başında Volley’i tanıtırken de söylediğim gibi, volley işlemlerini thread’leri bloklamadan yapıyor.

MainActivity.java

Eğer hiç bir hata ile karşılaşmazsanız resminiz başarıyla yüklenecektir. Hatta yüklenmeden önce Loading.png resmini göreceksiniz. Burada isterseniz başka Drawable yapılarıda kullanabilirsiniz.

Rest Servisleri

Şimdi diğer bahsettiğimiz konuyla ilgili bir örnek yapalım. Bu arada Rest servislerine bağlanıp bilgi çekelim. Ben örnek için hali hazırda ayakta olan facebook servislerinden yararlanacağım. Facebook grap api kullanarak facebook android ile ilgili bilgi çekeceğiz. Bunun için kullanacağımız URL aşağıda verilmiştir.

  • http://graph.facebook.com/android

İlk örneğimizi basit bir istek üzerinden yapacağız. Bunun için StringRequest kullanacağız. Bu request ile döndn değerin içeriği doğrudan string olarak kullanılabiliyor. Bu bilgiler ışığında MainActivity.java sınıfının içeriği aşağıdaki gibi değiştiriliyor.

MainActivity.java

Bu şekilde projenizi çalıştırdığınızda Toast mesajının içerisinde JSON sonucunu göreceksiniz.

Gson Request

Peki bu Json sonucu bizim için yeterli mi? Tabiki de hayır. Bizim için kullanılmaz durumda. Bunun illaki yakalanıp bir nesneye çevrilmesi gerekiyor. Bizde bunun için GSON kütüphanesini kullanacağız. Fakat tüm istekleri tek tek GSON ile çevirmek yerine kendi request sınıfımızı geliştireceğiz. Bunu yapmadan önce GSON kütüphanesini bu linkten indirin ve libs klasörünün altına atın.

Öncelikle GsonRequest sınıfını oluşturuyoruz.

GsonRequest.java

Şimdi ise Json yapsını çevirirken kullanacağımız sınıfı yaratıyoruz.

FacebookAndroid.java

Son olarak MainActivity sınıfında gerekli değişiklikleri yapıp sonucu test ediyoruz.

MainActivity.java

Kodumuzu çalıştırdığımızda, FacebookAndroid sınıfı içerisinde yazdığımız toString methodunun sonucunu göreceğiz. Burada listener içerisinde isterseniz istediğiniz View alanlarınıda güncelleyebilirsiniz.

Son

Baştada bahsettiğim gibi Volley kütüphanesi ilk kullanmaya başladığımdan beri beni kendine hayran bıraktı. Umarım sizin içinde bu şekilde olur.

Referanslar

End Of Line