Android Volley+JSONObjectRequest Caching




response android-volley (3)

إجراء 1+ لـ oleksandr_yefremov و skyfishjy أيضًا ، وتقديم طبقة خرسانية قابلة لإعادة الاستخدام مناسبة لجين أو غيرها من واجهات برمجة التطبيقات المستندة إلى مجموعة الأحرف:

public class CachingStringRequest extends StringRequest {
    public CachingStringRequest(int method, String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
        super(method, url, listener, errorListener);
    }

    public CachingStringRequest(String url, Response.Listener<String> listener, Response.ErrorListener errorListener) {
        super(url, listener, errorListener);
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String parsed;
        try {
            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            parsed = new String(response.data);
        }
        return Response.success(parsed, parseIgnoreCacheHeaders(response));
    }
}

حيث تأتي وظيفة parseIgnoreCacheHeaders () من الجواب oleksandr_yefremov أعلاه. استخدم الفئة CachingStringRequest في أي مكان يكون فيه json الناتج على ما يرام إلى التخزين المؤقت لمدة 3 دقائق (مباشرة) و 24 ساعة (انتهت صلاحيتها لكن لا تزال متوفرة). طلب عينة:

CachingStringRequest stringRequest = new CachingStringRequest(MY_API_URL, callback);

وداخل وظيفة onResponse () للكائن رد الاتصال ، تحليل json. عيّن أي حدود للتخزين المؤقت تريدها - يمكنك وضع المعلمات لإضافة تاريخ انتهاء مخصص لكل طلب.

للمتعة ، جرب هذا في تطبيق بسيط يقوم بتنزيل json ويعرض المعلومات التي تم تنزيلها. بعد ملء ذاكرة التخزين المؤقت باستخدام أول عملية تنزيل ناجحة ، شاهد العرض السريع أثناء تغيير الاتجاهات بينما يتم تشغيل ذاكرة التخزين المؤقت (لا يحدث التنزيل بسبب حدوث مخبأ مباشر). الآن قتل التطبيق ، انتظر 3 دقائق حتى انتهت صلاحية ذاكرة التخزين المؤقت (ولكن ليس 24 ساعة حتى يتم إزالتها من ذاكرة التخزين المؤقت) ، وتمكين وضع الطائرة ، وإعادة تشغيل التطبيق. سيحدث رد اتصال الخطأ في Volley ، وستظهر ميزة "رد" onResponse () الناجح من البيانات المخزنة مؤقتًا ، مما يسمح لتطبيقك بعرض كل من المحتوى كما يعرف / يحذر من أنه يأتي من ذاكرة التخزين المؤقت منتهية الصلاحية.

إن أحد استخدامات هذا النوع من التخزين المؤقت هو تجنب اللوادر وغيرها من وسائل التعامل مع تغيير التوجه. إذا كان الطلب يمر عبر وحدة فردية ، ويتم تخزين النتائج مؤقتًا ، فإن عمليات التحديث التي تحدث عبر تغيير الاتجاه يتم عرضها بسرعة من ذاكرة التخزين المؤقت ، تلقائيًا بواسطة Volley ، بدون أداة التحميل.

بالطبع ، هذا لا يناسب جميع المتطلبات. YMMV

public class CustomRequest extends JsonObjectRequest {

    public CustomRequest(String url, JSONObject params,
            Listener<JSONObject> listener, ErrorListener errorListener)
            throws JSONException {
        super(Method.POST,url, params, listener,
                errorListener);
        this.setShouldCache(Boolean.TRUE);
    }
}

كنت آمل أن تكون هذه الشفرة كافية لي للحصول على تخزين ضمني لردود الفعل. لست متأكدا إذا كان يعمل أم لا ، لأنني كنت تحت الافتراض عند إرسال طلب:

  1. سيؤدي ذلك إلى الوصول إلى ذاكرة التخزين المؤقت أولاً وإرسالها إلى onresponse

  2. ثم عندما تأتي النتائج من خلال الخادم البعيد ، فإنها ستوفرها على الرد

تحديث:

فكنت أحسب كيفية استرداد ذاكرة التخزين المؤقت وإعادة تكوينها في JSONObject وإرسالها عبر وظيفة OnResponse ولكن لا يبدو ذلك فعالًا نظرًا لوجود ذاكرة تخزين مؤقت ضمنية. يجب على JsonObjectRequest class بإرجاع JSONObject مثل الإدخال المخزن مؤقتًا بدلاً من بيانات الاستجابة الأولية.

ولكن ما زلت مهتمة لمعرفة ما إذا كنت أخطئ بعض الشيء.

الغموض يرجع فقط إلى عدم وجود وثائق ، لذلك أعتذر إذا كنت في عداد المفقودين شيء واضح تماما.


تمكّنت من إجبار Volley على تخزين جميع الردود من خلال توسيع StringRequest واستبدال الطلب الذي أريد CachingStringRequest مؤقتًا مع CachingStringRequest .

في طريقة parseNetworkResponse أقوم بإزالة رؤوس Cache-Control . بهذه الطريقة يستمر Volley في الاستجابة في ذاكرة التخزين المؤقت المضمنة به.

public class CachingStringRequest extends StringRequest {
    private static final String CACHE_CONTROL = "Cache-Control";

    public CachingStringRequest(int method,
                                String url,
                                Response.Listener<String> listener,
                                Response.ErrorListener errorListener) {
        super(method, url, listener, errorListener);
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        // I do this to ignore "no-cache" headers
        // and use built-in cache from Volley.
        if (response.headers.containsKey(CACHE_CONTROL)) {
            response.headers.remove(CACHE_CONTROL);
        }

        return super.parseNetworkResponse(response);
    }
}

يوفر oleksandr_yefremov رموزًا رائعة يمكنها مساعدتك عند التعامل مع إستراتيجية ذاكرة التخزين المؤقت في Android Volley ، خاصة عندما تحتوي واجهة برمجة تطبيقات REST على عناوين "Cache-Control" غير صحيحة أو إذا كنت تريد المزيد من التحكم في إستراتيجية ذاكرة التخزين المؤقت لتطبيقك.

المفتاح هو HttpHeaderParser.parseCacheHeaders(NetworkResponse response)) . إذا كنت ترغب في الحصول على استراتيجية ذاكرة التخزين المؤقت الخاصة بك. استبدالها مع parseIgnoreCacheHeaders(NetworkResponse response) في الفئة المقابلة .

إذا كان صفك يمتد JsonObjectRequest ، فانتقل إلى JsonObjectRequest وابحث

@Override
protected Response<JSONObject> parseNetworkResponse(NetworkResponse response) {
    try {
            String jsonString =new String(response.data, HttpHeaderParser.parseCharset(response.headers));
            return Response.success(new JSONObject(jsonString),HttpHeaderParser.parseCacheHeaders(response));
        }catch (UnsupportedEncodingException e) {
            return Response.error(new ParseError(e));
        }catch (JSONException je) {
            return Response.error(new ParseError(je));
        }
}

واستبدال HttpHeaderParser.parseCacheHeaders(response) مع HttpHeaderParser.parseIgnoreCacheHeaders







android-volley