0

我正在使用这样的截击。问题是,在我的例子中,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());

注意:我使用DiskLruCache的是 Jake Wharton 编写的,一切正常,但是这样,缓存只存在于磁盘上。如果存在,我希望 Volley 从内存中获取位图,否则从磁盘中获取,如果 URL 没有缓存,则进行网络调用。

4

1 回答 1

0

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-Control 和/或来自服务器的其他标头。

据我所知,尽管没有 Cache-Control 或相关标头,但默认情况下,volley 会缓存所有请求。但是,如果不存在此类标头,则不会使用缓存。

如果不想改变 volley 的逻辑,可以考虑从服务端支持 Cache。

于 2015-11-27T10:09:41.417 回答