如何自动清除凌空缓存?

时间:2014-06-28 07:22:11

标签: android caching android-volley

我想每30分钟清除一次请求队列。

那么自动清除凌空缓存的最佳方法是什么?

通过扩展凌空缓存类来覆盖方法?

或者构建一个定时器,每次需要时都会清除缓存?

3 个答案:

答案 0 :(得分:19)

Google Volley提供了两种方法来清除缓存中的项目:

AppController.getInstance().getRequestQueue().getCache().remove(key);

AppController.getInstance().getRequestQueue().getCache().invalidate(key, fullExpire);

删除表示您要删除实际的缓存数据。

无效表示您只是将数据标记为无效。因此,凌空将检查服务器数据是否仍然有效。 完整过期决定在排球验证服务器之前是否使用数据。

要在每30分钟清除缓存,请使用以下代码: -

您可以使用volley的 serverDate 来获取最初收到回复的日期

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

因此,在您的代码中使用 getMinutesDifference 函数作为

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

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

答案 1 :(得分:0)

我试图使用remove(key)从缓存中删除位图,但它无法正常工作,因此我检查了putBitmap(String url, Bitmap bitmap)收到的网址。我发现url有一些像#W0#H#S7http...这样的前缀,这是因为每个网址都有一个排名调用getCacheKey(String url, int maxWidth, int maxHeight, ScaleType scaleType)。因此,如果你想从缓存中删除url,那么你还必须调用此函数来获取url的密钥。

 String key = mImageLoader.getCacheKey(url, 0, 0, ImageView.ScaleType.CENTER_INSIDE);

 mRequestQueue.getCache().remove(key);

如果您正在使用0,0 and ImageView.ScaleType.CENTER_INSIDE传递最小高度和宽度以及您正在使用的比例类型,请通过imageLoader.get(String requestUrl,ImageLoader.ImageListener listener)

注意 getCacheKey()是ImageLoader类的私有函数,因此您必须将其更改为public才能在app中使用它。

答案 2 :(得分:0)

简单的方法是覆盖onRequestFinished方法并清除缓存。或者你可以在30分钟后在计时器内跑。

final RequestQueue requestQueue = Volley.newRequestQueue(this);
requestQueue.add(stringRequest);

requestQueue.addRequestFinishedListener(new RequestQueue.RequestFinishedListener<Object>() {
            @Override
            public void onRequestFinished(Request<Object> request) {
                requestQueue.getCache().clear();
            }
        });