我用的是这样的凌空抽射。问题是,在我的情况下,Volley只将图像缓存在内存中,而不在磁盘上。如果我强制我的应用程序,所有缓存都将从内存中删除。如何在内存和磁盘上都有缓存?
public ImageLoader getImageLoader() {
getRequestQueue();
if (mImageLoader == null) {
mImageLoader = new ImageLoader(this.mRequestQueue, new LruBitmapCache(getApplicationContext()));
}
return this.mImageLoader;
}
holder.picture.setImageUrl(url, MyApplication.getInstance().getImageLoader());
注意:我使用了Jake Wharton编写的DiskLruCache
,一切都很好,但这样,缓存只存在于磁盘上。如果存在,我希望Volley从内存中获取位图,如果存在,则从磁盘中获取位图;如果URL没有缓存,则进行网络调用。
Volley首先尝试在LruBitmapCache中查找缓存,您可以在ImageLoader.java 中找到相关代码
Bitmap cachedBitmap = mCache.getBitmap(cacheKey);
if (cachedBitmap != null) {
// Return the cached bitmap.
ImageContainer container = new ImageContainer(cachedBitmap, requestUrl, null, null);
imageListener.onResponse(container, true);
return container;
}
然后Volley采用与其他http请求相同的方式(不使用ImageLoader)。简而言之,默认情况下使用DiskLruCache。Volley使用CacheDispatcher来处理磁盘上的缓存。缓存策略基于缓存控制和/或来自服务器的其他标头。
据我所知,默认情况下,尽管没有缓存控制或相关的头,截击仍会缓存所有请求。但是,如果不存在此类标头,则不会使用缓存。
如果您不想改变截击的逻辑,可以考虑从服务器端支持Cache。