Caching Volley中的磁盘缓存不工作
我正在使用截击来缓存应用程序中的图像。内存缓存工作正常,但磁盘上没有缓存映像。代码如下所示 VolleySingleton.javaCaching Volley中的磁盘缓存不工作,caching,android-volley,diskcache,Caching,Android Volley,Diskcache,我正在使用截击来缓存应用程序中的图像。内存缓存工作正常,但磁盘上没有缓存映像。代码如下所示 VolleySingleton.java public class VolleySingleton { public static final String TAG = "VolleySingleton"; private static VolleySingleton mInstance = null; private RequestQueue mRequestQueue;
public class VolleySingleton {
public static final String TAG = "VolleySingleton";
private static VolleySingleton mInstance = null;
private RequestQueue mRequestQueue;
private ImageLoader mImageLoader;
private VolleySingleton(Context context){
mRequestQueue = Volley.newRequestQueue(context);
mImageLoader = new ImageLoader(this.mRequestQueue,new ImageLoader.ImageCache() {
private final LruCache<String, Bitmap> mCache = new LruCache<String, Bitmap>(3);
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url,bitmap);
}
});
}
public static VolleySingleton getmInstance(Context context){
if(mInstance == null){
mInstance = new VolleySingleton(context);
}
return mInstance;
}
public RequestQueue getmRequestQueue(){
return this.mRequestQueue;
}
public ImageLoader getmImageLoader(){
return mImageLoader;
}
}
好的,我解决了这个问题。这是因为我从服务器获取的图像在其响应中将缓存控制标记设置为no cache 缓存控制:无缓存,无缓存,最大年龄=15552000
通过修改库中的HttpHeaderParser.java,我让volley忽略了这个标记。现在工作正常了好的,我解决了这个问题。这是因为我从服务器获取的图像在其响应中将缓存控制标记设置为no cache 缓存控制:无缓存,无缓存,最大年龄=15552000 通过修改库中的HttpHeaderParser.java,我让volley忽略了这个标记。现在工作正常了@SathMk 我建议您不要忽略任何标记缓存控制标头,如果您确实希望在标头显示no cahce时将图像缓存更长时间,那么您可以使用技巧增加最大年龄(如果它与缓存中的一样为非零)。另一方面,对于数据请求,缓存无法正常工作
if (headerValue != null) {
hasCacheControl = true;
String[] tokens = headerValue.split(",");
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i].trim();
if (token.equals("no-cache") || token.equals("no-store")) {
//Check if no-cache is there then still check again the max-age
if (token.startsWith("max-age=")) {
try {
maxAge = Long.parseLong(token.substring(8));
} catch (Exception e) {
return null;
}
}
} else if (token.startsWith("max-age=")) {
try {
maxAge = Long.parseLong(token.substring(8));
} catch (Exception e) {
}
} else if (token.equals("must-revalidate") || token.equals("proxy-revalidate")) {
maxAge = 0;
}
}
}
检查是否没有缓存,然后再次检查最大年龄
我建议您不要忽略任何标记缓存控制标头,如果您确实希望在标头显示no cahce时将图像缓存更长时间,那么您可以使用技巧增加最大年龄(如果它与缓存中的一样为非零)。另一方面,对于数据请求,缓存无法正常工作
if (headerValue != null) {
hasCacheControl = true;
String[] tokens = headerValue.split(",");
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i].trim();
if (token.equals("no-cache") || token.equals("no-store")) {
//Check if no-cache is there then still check again the max-age
if (token.startsWith("max-age=")) {
try {
maxAge = Long.parseLong(token.substring(8));
} catch (Exception e) {
return null;
}
}
} else if (token.startsWith("max-age=")) {
try {
maxAge = Long.parseLong(token.substring(8));
} catch (Exception e) {
}
} else if (token.equals("must-revalidate") || token.equals("proxy-revalidate")) {
maxAge = 0;
}
}
}
检查是否没有缓存,然后仍然再次检查最大年龄