【问题标题】:Android Volley, invalidate cache and make fresh request every (x) minutesAndroid Volley,使缓存无效并每 (x) 分钟发出一次新请求
【发布时间】:2014-06-30 16:46:53
【问题描述】:

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

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

【问题讨论】:

    标签: android caching android-volley


    【解决方案1】:

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

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

    这个返回日期时间很长。 并在您的代码中使用 mindifference 函数作为

      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);
    }
    

    如果先前的 url 响应 >=30 分钟,它将使缓存无效。

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

    【讨论】:

    • @HemsLodha 无法正常工作是什么意思?请详细说明。
    • 现在我的作品出现了问题,感谢@Giru Bhai。但是当我们通过 volley header 从服务器请求数据时,缓存应该在一个时间范围内过期。是否可以 ?如果是,那么如何?
    • 对于listview我还需要调用notifychanged吗?
    猜你喜欢
    • 2021-06-13
    • 1970-01-01
    • 2017-04-11
    • 1970-01-01
    • 2011-06-23
    • 1970-01-01
    • 2021-04-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多