Android Volley,使缓存无效并每隔x(x)分钟发出新请求

时间:2014-06-30 16:46:54

标签: android caching android-volley

我找不到更新的答案。我正在向Volley发送请求到Web API。它返回JSON。我正在使用如下所示的缓存功能,但我想确保listview每隔一段时间刷新一次(比如现在说30分钟)。如何使此给定URL的缓存无效以使我的应用程序自动处理(无需刷新按钮)。这个question有助于指出invalidate和remove之间的区别。

MainActivity.java

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

        } else 
        {
            // making fresh volley request and getting json

            JsonArrayRequest getRequest = new JsonArrayRequest(URL_FEED,
                    new Response.Listener<JSONArray>()
                    {
                        @Override public void onResponse(JSONArray response) {
                            VolleyLog.d(TAG, "Response: " + response.toString());
                            if (response != null) {
                                parseJsonFeed(response);
                            }
                            Log.d("Response", response.toString());
                        }
                    },......ErrorListener

1 个答案:

答案 0 :(得分:4)

要刷新列表视图,您可以使用volley的 serverDate 来获取最初收到回复的日期

AppController.getInstance().getRequestQueue().getCache().get(url).serverDate

此返回日期时间长。 在您的代码中使用minutedifference函数

  public static long getMinutesDifference(long timeStart,long timeStop){
            long diff = timeStop - timeStart;
            long diffMinutes = diff / (60 * 1000);

            return  diffMinutes;
        }

并在代码中调用此函数

Calendar calendar = Calendar.getInstance();
long serverDate = AppController.getInstance().getRequestQueue().getCache().get(url).serverDate;
if(getMinutesDifference(serverDate, calendar.getTimeInMillis()) >=30){
   AppController.getInstance().getRequestQueue().getCache().invalidate(URL_FEED, true);
}

如果之前的网址响应&gt; = 30分钟,它将使缓存无效。

此(无效)允许继续使用此数据,直到进行新的调用并使用新响应覆盖缓存的响应。