Mobil Programlama

Android

Standart Bir İstek (Request) Oluşturmak

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

Bu eğitim içeriğinde sizlere Volley'de sıkça kullanılan şu istek (request) tiplerini nasıl kullanacağınızı göreceksiniz:

  • StringRequest. Tanımladığınız URL'den yanıt (response) olarak ham bir string almanıza yarar. Bunun için İstek Kuyruğunu (RequestQueue) Ayarlamak içeriğindeki örneğe bakabilirsiniz.
  • ImageRequest: Özelleştirilmiş URL ile resim cevaplarını almanızı sağlar.
  • JsonObjectRequest ve JsonArrayRequest: Özelleştirilmiş URL ile json nesneleri ve doğrudan array tipinde cevapları almanızı saglar. 

Eğer ihtiyacınız olan sorgular bunlardan biriyse muhtemelen özel olarak bir geliştirme yapmanız gerekmez. Bu içerik sizlere bu standart sorguları nasıl yapacağınızı ayrıntılı şekilde anlatmaktadır. Bir sonraki eğitimde özel bir sorgu hazırlamayı göreceksiniz.

Resim İsteği

Volley kütüphanesi resim isteği yapmak için aşağıda ayrıntısıyla yazan sınıflara sahiptir. Bu sınıflar resim işleme amacıyla bir diğerine farklı aşamalarda gerekli olduğundan sırayla verilmiştir.

  • ImageRequest : Belirtilen URL adreslerinden resim çekmek için kullanılan ve kullanılabilir bitmap şeklinde verir. Bunun yanında boyutlandırma yapmayada imkan saglar. En temel avantajı Volley iş parçacığı işlem süreç zamanlamasını (thread scheduler) garanti altına alarak zor olan resim işleme işlemlerini otomatikman yapar.
  • ImageLoader: Uzaktaki URL'lerdeki resimlerin yüklenmesinin kontrolü ve önbelleklenmesine yardımcı olur.  ImageLoader çoklu ImageRequest için bir maestro görevi görerek hepsinin düzenli çalışmasını sağlar. Örnek vermek gerekirse bir listView içerisine konulan bir çok tumnail görseli için ImageLoader hafiza içi önbellekleme yaparak karmaşa ve değişikliğin önüne geçer. 
  • NetworkImageView : ImageLoader üzerine kurulan bu yapı network URL'lerinden çekilen resimlerlerde ImageView'ın yerini alır.NetworkImageView ayrıca yapıdan ayrılmış bekleyen isteklerin kontrolünü saglar.

ImageRequest Kullanımı

Aşagıda kullanım örneğini göreceğiniz ImageRequest yapısı, URL üzerinden resimleri getirir ve uygulamada gösterir. Burada aşağıdaki kod örneğinin RequestQueue ile etkileşime geçtiğini unutmamak gerekir. Okumadıysanız ilgili eğitime buradan ulaşabilirsiniz.

ImageView mImageView;
String url = "http://i.imgur.com/7spzG.png";
mImageView = (ImageView) findViewById(R.id.myImage);
...

// belirtilen URL'den resim gösterir, arayüzde ilgili bölüme ekler
ImageRequest request = new ImageRequest(url,
    new Response.Listener() {
        @Override
        public void onResponse(Bitmap bitmap) {
            mImageView.setImageBitmap(bitmap);
        }
    }, 0, 0, null,
    new Response.ErrorListener() {
        public void onErrorResponse(VolleyError error) {
            mImageView.setImageResource(R.drawable.image_load_error);
        }
    });
// RequestQueue'ya singleton class yapısıyla erişir.
MySingleton.getInstance(this).addToRequestQueue(request);

ImageLoader ve NetworkImageView'ı Kullanmak

Çoklu resim gösterim işlemlerde kullanabiliceğiniz ImageLoader ve NetworkImageView düzenli ve verimli şekilde size yardımcı olur. Layout Xml dosyanızda NetworkImageView'ı  ImageView kullanığınız yolda kullanmalısınız. Aşağıda örneğini görebilirsiniz.

<com.android.volley.toolbox.NetworkImageView
        android:id="@+id/networkImageView"
        android:layout_width="150dp"
        android:layout_height="170dp"
        android:layout_centerHorizontal="true" />

ImageLodader'ı ise bir resmi göstermek için kullabilirsiniz. Aşagıda örneğini görebilirsiniz.

ImageLoader mImageLoader;
ImageView mImageView;
// resmin yüklenmiş olan URL'yi belirtiyoruz.
private static final String IMAGE_URL =
    "http://developer.android.com/images/training/system-ui.png";
...
mImageView = (ImageView) findViewById(R.id.regularImageView);

//singleton class kullanılarak ImageLoader'ı getiriyoruz. 
mImageLoader = MySingleton.getInstance(this).getImageLoader();
mImageLoader.get(IMAGE_URL, ImageLoader.getImageListener(mImageView,
         R.drawable.def_image, R.drawable.err_image));

NetworkImageView bu işlemi eğer ImageView kısmını dolduruyorsanız tümüyle yapabilir. Aşağıda bunun bir örneğini görebilirsiniz.

ImageLoader mImageLoader;
NetworkImageView mNetworkImageView;
private static final String IMAGE_URL =
    "http://developer.android.com/images/training/system-ui.png";
...
mNetworkImageView = (NetworkImageView) findViewById(R.id.networkImageView);

//singleton class kullanılarak ImageLoader'ı getiriyoruz.
mImageLoader = MySingleton.getInstance(this).getImageLoader();

// Vıew'ın içine yüklenecek resmin URL'sini giriyoruz.
// ImageLoader'ı sorgunun yapılacağı şekilde özelleştiriyoruz.
mNetworkImageView.setImageUrl(IMAGE_URL, mImageLoader);

Yukardaki kod parçaları RequestQueue ve ImageLoader'a singleton sınıfı yoluyla erişmenin yolunu gösterir. Bu yaklaşım uygulamanızın tek bir örnekle, bu sınıfların uygulama açık kaldığı sürece çalışmasını garanti altına alır. Ana fonksiyon olan ve dahili hafıza ön yüklemesi yapan ImageLoader sınıfı (resimlerin yükleme ve ön yükleme durumları için yardımcı sınıftır) için önemli olan bu özellik titreme olmadan ekran döndürmesi yapmayı sağlar. Singleton kalıbı kullanmak bitmap ön yüklemesi yaparak aktvitelerin daha uzun çalışmasını sağlar. Eğer bir aktivitede ImageLoader yaratmadıysanız, kullanıcı telefonu her çevirdğinde tekrar tekrar kendiliğinden oluşturulacaktır. Bu da titremeye yol açacaktır. 

 

Örnek LRU Ön Belleği

Volley araç çubuğu DiskBasedCache sınıfı ile standart bir ön yükleme gerçeklemesi sunar. Bu sınıf dosyaları doğrudan bir sabit diskte belirlenmiş konuma yazar. ImageLoader kullanmak içinse özel dahili hafızada bulnan LRU bitmap ön belleği kullanmanız gerekir. Bu ön bellek ImageLoader.ImageCache interface'inden gerçeklenir. Ön belleğinizi singleton olarak kurmak isteyebilirsiniz, bunun için Setting Up a RequestQueue içeriğine bakınız.

Dahili hafıza LruBitmapCache sınıfı gerçeklemesinin bir örneğini aşağıda bulabilirsiniz. LruCache sınıfı türetir ve ImageLoader.ImageCache interface'inden gerçeklenir:



import android.graphics.Bitmap;
import android.support.v4.util.LruCache;
import android.util.DisplayMetrics;
import com.android.volley.toolbox.ImageLoader.ImageCache;

public class LruBitmapCache extends LruCache<String, Bitmap>
        implements ImageCache {

    public LruBitmapCache(int maxSize) {
        super(maxSize);
    }

    public LruBitmapCache(Context ctx) {
        this(getCacheSize(ctx));
    }

    @Override
    protected int sizeOf(String key, Bitmap value) {
        return value.getRowBytes() * value.getHeight();
    }

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

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

    // Returns a cache size equal to approximately three screens worth of images.
    public static int getCacheSize(Context ctx) {
        final DisplayMetrics displayMetrics = ctx.getResources().
                getDisplayMetrics();
        final int screenWidth = displayMetrics.widthPixels;
        final int screenHeight = displayMetrics.heightPixels;
        // 4 bytes per pixel
        final int screenBytes = screenWidth * screenHeight * 4;

        return screenBytes * 3;
    }
}

Bu ön bellekte kullanmak üzere bir ImageLoader'ın nasıl tanımlanacağı ise aşağıdadır:

RequestQueue mRequestQueue; // assume this exists.
ImageLoader mImageLoader = new ImageLoader(mRequestQueue, new LruBitmapCache(
            LruBitmapCache.getCacheSize()));

 

JSON İsteği

Volley, aşağıdaki sınıfları JSON istekleri için sağlar:

  • JsonArrayRequest - Verilen URL'de JSONArray'in cevap içeriğini almak için kullanılan istek.
  • JsonObjectRequest - Verilen URL'de JSONObject'in cevap içeriğini almak için kullanılan istek. Aynı zamanda isteğe bağlı bir JSONObject'in istek içeriğinin parçası olarak gönderilmesini sağlar.

Her iki sınıf da ortak bir taban sınıfı JsonRequest'e dayanır. İkisini de diğer istek tiplerinde kullanılan aynı kalıp ile kullanabilirsiniz. Örneğin aşağıdaki kod parçası JSON akışını alarak arayüzde bir yazı olarak gösterir:



TextView mTxtDisplay;
ImageView mImageView;
mTxtDisplay = (TextView) findViewById(R.id.txtDisplay);
String url = "http://my-json-feed";

JsonObjectRequest jsObjRequest = new JsonObjectRequest
        (Request.Method.GET, url, null, new Response.Listener() {

    @Override
    public void onResponse(JSONObject response) {
        mTxtDisplay.setText("Response: " + response.toString());
    }
}, new Response.ErrorListener() {

    @Override
    public void onErrorResponse(VolleyError error) {
        // TODO Auto-generated method stub

    }
});

// Access the RequestQueue through your singleton class.
MySingleton.getInstance(this).addToRequestQueue(jsObjRequest);

Gson'a dayanan bir özel JSON isteği gerçeklemesi örneği için bir sonraki eğitim içeriği olan Implementing a Custom Request'e bakınız.