我想每30分钟清除一次请求队列。
那么自动清除凌空缓存的最佳方法是什么?
通过扩展凌空缓存类来覆盖方法?
或者构建一个定时器,每次需要时都会清除缓存?
答案 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();
}
});