Android 301Başlangıç seviyesi derslerde Android uygulama geliştirme ortamını detaylı olarak inceliyoruz.

Tüm Eğitimleri Aldın mı? Kendini sınamanın tam zamanı

Haydi Sınava Gir

Basit Bir İstek (Request) Göndermek

Kategori : Mobil | Lisans : Creative Commons (by-nc-sa) | En son 12.09.2019 tarihinde güncellendi
Eğitmen : Geleceği Yazanlar Ekibi
Etiketler : android-request android

Volley'i büyük oranda bir RequestQueue oluşturarak ve ona Request nesneleri göndererek kullanacaksınız. RequestQueue, ağ işlemleri, önbelleğe okuma/yazma ve yanıtları (response) ayrıştırmak için çalışan "worker thread"leri yönetir.

Request'ler ham yanıtları (response) ayrıştırır ve Volley bu ayrıştırılmış yanıtları main thread'e teslim etmek için düzgün parçalara ayırır.

Bu içerik size kullanımı kolay Volley.newRequestQueue metodunu (sizin için RequestQueue'ları ayarlar) kullanarak nasıl istek göndereceğinizi gösterecektir. Sıradaki eğitim içeriğinde de kendi RequestQueue'larınızı nasıl oluşturacağınız hakkında bilgi alabilirsiniz.

Bu eğitim içeriğinde ayrıca, isteklerinizi RequestQueue'ya nasıl ekleyebileceğinizi ve istediğinizde iptal edeceğinizi de bulabilirsiniz.

 

Gerekli izni eklemeyi unutmayın

Volley'i düzgün kullanmak için uygulamanızın manifest dosyasına android.permission.INTERNET iznini mutlaka eklemeniz gerekiyor. Aksi takdirde ağa bağlanamazsınız.

 

newRequestQueue metodunu kullanmak

Volley kütüphanesi, sizin için varsayılan ayarlarla RequestQueue'yu ayarlayan ve başlayan, kullanımı kolay Volley.newRequestQueue metodunu sunar. Örneğin:


final TextView mTextView = (TextView) findViewById(R.id.text);
...

// RequestQueue'yu ilklendirelim
RequestQueue queue = Volley.newRequestQueue(this);
String url ="http://www.google.com";

// verilen adresten bir string yanıt isteyelim
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener() {
    @Override
    public void onResponse(String response) {
        // yanıt string'inin ilk 500 karakterini gösterelim
        mTextView.setText("Gelen yanıt: "+ response.substring(0,500));
    }
}, new Response.ErrorListener() {
    @Override
    public void onErrorResponse(VolleyError error) {
        mTextView.setText("Çalışmıyor!");
    }
});
// İsteği RequestQueue'ya (istek kuyruğu) ekleyelim
queue.add(stringRequest);

Volley, ayrıştırılmış (parse edilmiş) veriyi her zaman main thread'e yollar. Main thread üzerinde çalışması, ResponseHandler'ınızın içinde doğrudan o an gelen verilerle UI bileşenlerini güncelleyebilmeniz açısından büyük kolaylıktır. Özellikle isteklerin iptal edilmesiyle ilgili olarak, kütüphanenin sağladığı önemli özellikler açısından bu kritiktir.

 

İstek göndermek

İstek göndereceğiniz zaman basitçe bir tane oluşturup bunu aşağıda gösterildiği gibi RequestQueue'ya add() metodu ile ekleyebilirsiniz. Bir defa isteği eklediğinizde, "pipeline" boyunca ilerleyerek cevap ayrıştırılmış ve gönderilmiş olur.

add() metodunu çağırdığınızda, Volley bir önbellekleme thread'i ve ağ işlerini dağıtan thread'leri başlatır. Kuyruğa yeni bir istek eklediğinizde, önbellek thread'i tarafından alınır ve önceliklendirilir:

Eğer istek önbellekten sunulabiliyorsa, önbelleklenmiş cevap yine önbellek thread'inden alınarak ayrıştırılır ve ayrıştırılmış olan bu yanıt main thread'e teslim edilir. Eğer istek, önbellekten sunulamıyorsa, doğrudan ağ kuyruğuna yerleştirilir. Müsait durumdaki ağ thread'i de isteği kuyruktan alarak HTTP işlemlerini gerçekleştirir. Ardından "worker thread"de yanıt ayrıştırılır ve önbelleğe yazılır ve son olarak main thread'e verilir.

Şunu not düşelim: Bloklu I/O işlemleri ve ayrıştırma/çözme (parsing/decoding) gibi pahalı işler "worker thread"ler üzerinde gerçekleştirilir. Herhangi bir thread'den yeni bir istek ekleyebilirsiniz fakat yanıtları her zaman main thread'e teslim edilir.

Şu akış diyagramı bir isteğin yaşamını resmeder:

Volley'de bir isteğin yaşam döngüsü

Diyagram 1: Bir isteğin yaşamı

 

İsteği iptal etmek

Bir isteği iptal etmek için Request nesnesi üzerinden cancel() metodunu çağırmalısınız. Volley, bir kere iptal edildikten sonra ResponseHandler'ın bu isteği bir daha tekrar yapmayacağını garanti eder. Bunun pratikteki anlamı, Activity'nizin onStop() metodundayken sırada bekleyen tüm istekleri iptal edebilirsiniz ve ResponseHandler'larınızı onSaveInstanceState() zaten çağrıldı mı, getActivity() == null mü gibi korumaya yönelik kontroller yapmaktan kurtarabilirsiniz.

Bu davranış biçiminin kazanımlarını elde etmek için neredeyse o an "havada" olan tüm sorgularınızı uygun zamanda iptal edebilmek için izlemeniz gerekmektedir. Bunun kolay bir yolu var: Her isteği bir "tag" nesnesiyle ilişkilendirebilirsiniz. Ardından bir sorguyu iptal etmek istediğinizde bu etiketi kullanarak iptal edebilirsiniz. Örnek vermek gerekirse, Activity amacıyla yapılan tüm istekleri Activity ile etiketleyebilirsiniz ve onStop() metodundayken requestQueue.cancelAll(this)'ı çağırabilirsiniz. Benzer şekilde bir ViewPager sekmesinin içindeki tüm küçük resim isteklerini ilgili sekmelerle etiketleyebilir ve sekme kaydırma sırasında, yeni sekmenin diğerindenden alınan isteklere karışmaması için onları iptal edebilirsiniz.

Aşağıda etiketler için string kullanan bir yapıyı örnek olarak inceleyebilirsiniz. 

  1. Etiketinizi tanımlayın ve isteklerinize ekleyin.
    
    public static final String TAG = "MyTag";
    StringRequest stringRequest; // Bunun var olduğunu varsayalım
    RequestQueue mRequestQueue;  // Bunun var olduğunu varsayalım
    
    // istek için etiket ayarlayalım
    stringRequest.setTag(TAG);
    
    // İstekleri RequestQueue'ya ekleyelim
    mRequestQueue.add(stringRequest);
  2. Activity'nizin onStop() metodundayken bu etikete sahip tüm istekleri iptal edin
    
    @Override
    protected void onStop () {
        super.onStop();
        if (mRequestQueue != null) {
            mRequestQueue.cancelAll(TAG);
        }
    }

İstekleri iptal ederken biraz dikkatli olun. Bir durumu veya başka bir görevi (process) ilerletmek için ResponseHandler'ınıza bağımlıysanız bunu hesaba katmalısınız. ResponseHandler çağrılmayacaktır.