Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/179.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何自动清除截击缓存?_Android_Caching_Android Volley - Fatal编程技术网

Android 如何自动清除截击缓存?

Android 如何自动清除截击缓存?,android,caching,android-volley,Android,Caching,Android Volley,例如,我希望每30分钟清除一次请求队列 那么,自动清除截击缓存的最佳方法是什么 通过扩展volley缓存类重写方法 或者构建一个计时器,每当我需要时,它都会清除缓存?Google Volley提供了两种从缓存中清除项目的方法: AppController.getInstance().getRequestQueue().getCache().remove(key); 及 删除表示您正在删除实际缓存的数据 无效表示您只是将数据标记为无效。因此,volley将与服务器检查数据是否仍然有效。full

例如,我希望每30分钟清除一次请求队列

那么,自动清除截击缓存的最佳方法是什么

通过扩展volley缓存类重写方法


或者构建一个计时器,每当我需要时,它都会清除缓存?

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

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

删除表示您正在删除实际缓存的数据

无效表示您只是将数据标记为无效。因此,volley将与服务器检查数据是否仍然有效。full expire确定是否在服务器验证数据之前使用数据

要在每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);
}

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

我试图使用
remove(key)
从缓存中删除位图,但它不起作用,因此我检查了
putbmap(字符串url,位图位图)
接收到的url。我发现url有一些前缀,比如
#W0#H#S7http…
这是因为对于每个url,截击调用
getCacheKey(字符串url,int-maxWidth,int-maxHeight,ScaleType-ScaleType)
。所以,如果您想从缓存中删除url,那么您还必须调用此函数来获取url的密钥

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

 mRequestQueue.getCache().remove(key);
如果您使用的是
imageLoader.get(String requestUrl,imageLoader.ImageListener listener)
则传递
0,0和ImageView.ScaleType.CENTER\u in
,否则传递您正在使用的最小高度、宽度和比例类型


注意
getCacheKey()
是ImageLoader类的私有函数,因此您必须将其更改为public,以便在应用程序中使用。

简单的方法是重写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();
            }
        });
final RequestQueue RequestQueue=Volley.newRequestQueue(this);
添加(stringRequest);
requestQueue.addRequestFinishedListener(新的requestQueue.RequestFinishedListener(){
@凌驾
公共无效onRequestFinished(请求){
requestQueue.getCache().clear();
}
});

那么,您认为我只需要使数据无效吗?我的问题是如何在没有任何刷新按钮的情况下自动使数据无效或清除..我发布了我的解决方案,也许它可以帮助某人。我使用一个扩展TimeTask的类,并使用run方法清除截取缓存。Hello Giru Bhai,AppController.getInstance().getRequestQueue().getCache().remove(键);在上面的一行中,“关键”是什么?我面临截击缓存问题。。。
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();
            }
        });