Mobil Programlama

Android

Özel İstek (Request) Gerçeklemesi

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

Bu eğitim içeriği, Volley desteği olmayan, kendinize özel istek tiplerini nasıl oluşturacağınızı anlatır.

 

Özel istek yazmak

Çoğu isteğin araç çubuğunda kullanıma hazır gerçeklemeleri mevcuttur. Örneğin cevabınız string, image ya da JSON ise muhtemelen özel istek yaratmanıza gerek yoktur.

Özel istek yaratmak durumlarında kaldığınızdaysa bütün yapmanız gereken şöyledir:

  • Request<T> sınıfı türetmek. Buradaki <T>, isteğin beklediği işlenmiş cevabın tipini temsil eder. Eğer sizin işlenmiş cevabınız bir stringse Request<String> sınıfını türeterek kendinize özel isteğinizi yaratırsınız. Bu türetimi görmek için Volley araç çubuğu sınıflarındaki StringRequest ve ImageRequest örneklerine bakabilirsiniz.
  • Soyut metodlar parseNetworkResponse() ve deliverResponse()'un gerçeklemeleri aşağıda daha detaylı anlatılmıştır.

 

parseNetworkResponse

Bir Response, verilen tipte (string, image veya JSON gibi) işlenmiş gönderime hazır cevapları da kapsar. Aşağıda bir parseNetworkRepsonse() gerçeklemesini görebilirsiniz:

@Override
protected Response<T> parseNetworkResponse(
        NetworkResponse response) {
    try {
        String json = new String(response.data,
        HttpHeaderParser.parseCharset(response.headers));
    return Response.success(gson.fromJson(json, clazz),
    HttpHeaderParser.parseCacheHeaders(response));
    }
    // yönetirme problemi
...
}

Şunları not edin:

parseNetworkRespons() NetworkResponse'u parametre olarak alır. Bu da cevabın yükünü byte

, HTTP durum kodu ve cevap başlığı olarak içerir.

Gerçeklemeniz, herhangi bir işleme hatasına karşın yazılmış cevap nesnenizi ve önyükleme metadatanızı ya da bir hatayı içeren Response <T> dönmelidir.

Eğer protokolünüz özel, standart olmayan önyükleme anlamı taşıyorsa Cache.Entry yaratabilirsiniz ancak genelde çoğu istekler şu şekilde de doğrudur:


[code]return Response.success(myDecodedObject,
        HttpHeaderParser.parseCacheHeaders(response));

Volley, parseNetworkResponse() metodunu çalışan bir iş parçacığı üzerinden çağırmalıdır. Bu, JPEG formatındaki bir dosyası Bitmap'e çevirmek gibi yüklü işleme operasyonlarının arayüz iş parçacığını engellememesini garanti altına alır.

 

deliverResponse

Volley, bu metodu, parseNetworkResponse()'tan döndürdüğünüz nesneyle çağırır. Bu işlemleri de ana iş parçacığında (main thread) yapar. Çoğu istek bir callback arayüzüne ihtiyaç duyar, örneğin:

protected void deliverResponse(T response2) {
        listener.onResponse(response2);

 

Örnek: GsonRequest

Gson, Java nesnelerini JSON'dan ve JSON'a yansıma kullanarak çeviren bir kütüphanedir. Java nesnelerinin aynı isimleri almalarına göre verilen JSON anahtarlarını Gson sınıf nesnesine yolladığınızda Gson sizin için gerekli yerleri dolduracaktır. İşleme için Gson kullanan bir Volley isteğinin tam gerçeklemesini aşağıda bulabilirsiniz:

public class GsonRequest<T> extends Request<T> {
    private final Gson gson = new Gson();
    private final Class<T> clazz;
    private final Map<String, String> headers;
    private final Listener<T> listener;

    public GsonRequest(String url, Class<T> clazz, Map<String, String> headers,
            Listener<T> listener, ErrorListener errorListener) {
        super(Method.GET, url, errorListener);
        this.clazz = clazz;
        this.headers = headers;
        this.listener = listener;
    }

    @Override
    public Map<String, String> getHeaders() throws AuthFailureError {
        return headers != null ? headers : super.getHeaders();
    }

    @Override
    protected void deliverResponse(T response) {
        listener.onResponse(response);
    }

    @Override
    protected Response<T> parseNetworkResponse(NetworkResponse response) {
        try {
            String json = new String(
                    response.data,
                    HttpHeaderParser.parseCharset(response.headers));
            return Response.success(
                    gson.fromJson(json, clazz),
                    HttpHeaderParser.parseCacheHeaders(response));
        } catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        } catch (JsonSyntaxException e) {
            return Response.error(new ParseError(e));
        }
    }
}

Volley, eğer kullanmak isterseniz sizin için JsonArrayRequest ve JsonArrayObject sınıflarını sunar. Daha fazla bilgi için Standart Bir İstek (Request) Yapma içeriğine bakabilirsiniz.