Volley Cache未获得更新

时间:2014-12-16 11:02:56

标签: android json android-volley

您好我在我的Android应用程序中使用volley jar来缓存离线模式的json数据。它运行正常。这是我的代码

Cache cache1 = AppController.getInstance().getRequestQueue().getCache();
        Entry entry1 = cache1.get(URL);
        if (entry1 != null) {
            // fetch the data from cache
            try {
                 data2 = new String(entry1.data, "UTF-8");
                try {
                    parseJsonFeed(new JSONObject(data2));
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

        } else {

            AppController.getInstance().getRequestQueue().getCache().remove(URL);
            // making fresh volley request and getting json
            JsonObjectRequest jsonReq1 = new JsonObjectRequest(Method.GET,
                    URL, null, new Response.Listener<JSONObject>() {

                        @Override
                        public void onResponse(JSONObject response) {
                            VolleyLog.d(TAG, "Response: " + response.toString());
                            if (response != null) {
                                parseJsonFeed(response);
                            }
                        }
                    }, new Response.ErrorListener() {

                        @Override
                        public void onErrorResponse(VolleyError error) {
                            VolleyLog.d(TAG, "Error:" + error.getMessage());
                        }
                    });

            // Adding request to volley request queue
            AppController.getInstance().addToRequestQueue(jsonReq1);
        }





private void parseJsonFeed(JSONObject response) {
        try {
             feedArray = response.getJSONArray("events");

            for (int i = 0; i < feedArray.length(); i++) {

                 feedObj = (JSONObject) feedArray.get(i);


                event_id.add(feedObj.getInt("event_id"));
                event_desc.add(feedObj.getString("event_title"));
                event_date.add(feedObj.getString("event_date"));
                event_place.add(feedObj.getString("event_place"));
                event_time.add(feedObj.getString("event_time"));

            }


             listView.setAdapter(new dataListAdapter(event_date,event_desc,event_place,event_time));





            //Log.i("event1111", event.toString());
        //  Log.i("event2222", event2.toString());
            Toast.makeText(getActivity(), "dataa"+event_id, 5000).show();

        } catch (JSONException e) {
            e.printStackTrace();


  }
     }

我的问题是我得到了数据。但是当我更新json数据时,缓存数据不会更新。所以如何根据json数据更改缓存数据。请事先帮助我:)

1 个答案:

答案 0 :(得分:0)

正确设置服务器的缓存头响应,我认为您需要更改标头的max-age或任何自定义配置,因为Volley查看标头然后将响应存储在缓存中,以下是它的剂量:

  headerValue = headers.get("Cache-Control");
        if (headerValue != null) {
            hasCacheControl = true;
            String[] tokens = headerValue.split(",");
            for (int i = 0; i < tokens.length; i++) {
                String token = tokens[i].trim();
                if (token.equals("no-cache") || token.equals("no-store")) {
                    return null;
                } else if (token.startsWith("max-age=")) {
                    try {
                        maxAge = Long.parseLong(token.substring(8));
                    } catch (Exception e) {
                    }
                } else if (token.equals("must-revalidate") || token.equals("proxy-revalidate")) {
                    maxAge = 0;
                }
            }
        }

        headerValue = headers.get("Expires");
        if (headerValue != null) {
            serverExpires = parseDateAsEpoch(headerValue);
        }

        serverEtag = headers.get("ETag");

        // Cache-Control takes precedence over an Expires header, even if both exist and Expires
        // is more restrictive.
        if (hasCacheControl) {
            softExpire = now + maxAge * 1000;
        } else if (serverDate > 0 && serverExpires >= serverDate) {
            // Default semantic for Expire header in HTTP specification is softExpire.
            softExpire = now + (serverExpires - serverDate);
        }

        Cache.Entry entry = new Cache.Entry();
        entry.data = response.data;
        entry.etag = serverEtag;
        entry.softTtl = softExpire;
        entry.ttl = entry.softTtl;
        entry.serverDate = serverDate;
        entry.responseHeaders = headers;