Mobil Programlama

Android

RequestQueue Kurulumu

Lisans: Creative Commons 26.11.2020 tarihinde güncellendi
Bakabileceğiniz Etiketler: Eğitmen: Geleceği Yazanlar Ekibi

Bir önceki eğitim içeriği, uygun metod olan Volley.newRequestQueue'yu Volley avantajlarını kullanarak RequestQueue kurmak için nasıl kullanacağınızı gösterdi. Bu eğitim içeriyse RequestQueue yaratmanın adımlarını göstererek kendinize özel davranış yaratmanızı sağlayacak.

Bu eğitim içeriği aynı zamanda RequestQueue'yu Singleton olarak yaratmanın kolay yolunu anlatacak. Bu da RequestQueue'nın uygulama açık kaldığı sürece çalışmasını sağlayacak.

 

Ağ ve önbellek kurulumu

RequestQueue'nun görevini yapabilmesi için isteklerin aktarılmasında kullanmak için bir ağa ve ön yüklemeleri idare edebilmek için bir önbelleğe ihtiyacı vardır. Bunların standart gerçeklemeleri Volley araç çubuğunda mevcuttur. DiskBasedCache dâhili hafıza indekslemesi yaparak her cevaba bir dosya verir. BasicNetwork ise AndroidHttpClient veya HttpURLConnection'daki seçimlerinize göre aktarım tabanlı bir ağ sunar.

BasicNetwork Volley'in varsayılan ağ gerçeklemesidir. Bir BasicNetwork uygulamanızın ağ bağlanmak için kullandığı HTTP vericisine göre tanımlanmalıdır. Bu AndroidHttpClient veya HttpURLConnection'dır:

API sürümü 9 (Gingerbread)'dan küçük olan Android API'leri için AndroidHttpClient kullanın. Gingerbread'ten düşük sürümler için HttpURLConnection güvenilir değildi. Bu konu hakkında daha detaylı bilgi için Android'in HTTP Vericileri bölümüne bakabilirsiniz. Android API seviyesi 9 ve daha yüksek olanlar için HttpURLConnection'ı kullanın.

Android'in bütün sürümlerinde kullanılacak bir uygulama yaratmak için çalıştığı cihazın Android sürümünü kontrol edip ona uygun HTTP vericisi seçebilirsiniz. Örneğin,

HttpStack stack;
...
// Eğer sürüm Gingerbread'ten yüksekse
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.GINGERBREAD) {
    // HttpURLConnection kullan.
} else {
    // AndroidHttpClient kullan.
}
Network network = new BasicNetwork(stack);

Aşağıdaki kod parçasında RequestQueue kurma örneğini de görebilirsiniz: 



RequestQueue mRequestQueue;

// Önbelleği tanımlamak
Cache cache = new DiskBasedCache(getCacheDir(), 1024 * 1024); // 1MB cap

// HttpURLConnection'ı HTTP vericisi olarak kullanmak için ağı ayarlamak.
Network network = new BasicNetwork(new HurlStack());

// RequestQueue'yı ön bellek ve ağ ile tanımlamak.
mRequestQueue = new RequestQueue(cache, network);

// Queue'yu başlatmak.
mRequestQueue.start();

String url ="http://www.myurl.com";

// İsteği formüle etmek
StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
        new Response.Listener<String>() {
    @Override
    public void onResponse(String response) {
        // Cevap ile bir şeyler yap.
    }
},
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            // Hatayı yakala.
    }
});

// RequestQueue'ya istek ekle.
mRequestQueue.add(stringRequest);
...

Eğer sadece bir sefere mahsus istek yapmak ve iş parçacağını ortada bırakmak istemiyorsanız, ihtiyacınız olduğu yerde RequestQueue yaratıp hata cevabınız geri geldiğinde stop() metodunu çağırabilirsiniz. Bunu da Sending a Simple Request içeriğinde bahsedilen Volley.newRequestQueue() metodunu kullanarak yapabilirsiniz. Bunu yapmak için en sık kullanılan yöntem, bir sonraki bölümde de anlatılacağı üzere RequestQueue'yu singleton olarak oluşturup uygulama açık kaldığı sürece çalışmasını sağlamaktadır.

 

Singleton kalıbı kullanmak

Eğer uygulamanız sabit bir ağ kullanımı yapıyorsa, uygulamanız açık kaldığı sürece çalışacak tek bir RequestQueue örneği kurmak muhtemelen en verimli yol olacaktır. Önerilen yol RequestQueue ve diğer Volley işlevselliklerini de içeren bir singleton sınıfı gerçeklemesi yapmaktır. Başka bir yol ise Application'a altsınıfı yaratıp RequestQueue'yu Application.onCreate() içinde kurmaktır. Bu yaklaşım çok tavsiye edilmemektedir çünkü statik bir singleton da aynı işlevselliği daha birimsel bir yolla da sağlar.

RequestQueue'nın Activitycontect içeriği içinde değil de Application içeriğinde somutlaştırılmalıdır. Bu RequestQueue'nın her aktivite (telefonun yan çevrilmesi gibi) de tekrar oluşturulması yerine uygulama çalıştığı sürece hayatta kalmasını garanti eder.

Aşağıda RequestQueue ve ImageLoader işlevselliği sağlayan singleton sınıfının bir örneğini görebilirsiniz:



private static MySingleton mInstance;
    private RequestQueue mRequestQueue;
    private ImageLoader mImageLoader;
    private static Context mCtx;

    private MySingleton(Context context) {
        mCtx = context;
        mRequestQueue = getRequestQueue();

        mImageLoader = new ImageLoader(mRequestQueue,
                new ImageLoader.ImageCache() {
            private final LruCache<String, Bitmap>
                    cache = new LruCache<String, Bitmap>(20);

            @Override
            public Bitmap getBitmap(String url) {
                return cache.get(url);
            }

            @Override
            public void putBitmap(String url, Bitmap bitmap) {
                cache.put(url, bitmap);
            }
        });
    }

    public static synchronized MySingleton getInstance(Context context) {
        if (mInstance == null) {
            mInstance = new MySingleton(context);
        }
        return mInstance;
    }

    public RequestQueue getRequestQueue() {
        if (mRequestQueue == null) {
            // getApplicationContext(), Activity veya BroadReceiver'a birinin girmesini engellemek için 
            // kullanılan bir anahtardır.
            mRequestQueue = Volley.newRequestQueue(mCtx.getApplicationContext());
        }
        return mRequestQueue;
    }

    public <T> void addToRequestQueue(Request<T> req) {
        getRequestQueue().add(req);
    }

    public ImageLoader getImageLoader() {
        return mImageLoader;
    }
}

RequestQueue'nın singleton sınıfı kullanarak çalıştırılması örneği aşağıdadır:


RequestQueue queue = MySingleton.getInstance(this.getApplicationContext()).
    getRequestQueue();
...

// RequestQueue'ya istek eklemek (burada stringRequest). 
MySingleton.getInstance(this).addToRequestQueue(stringRequest);