NetworkImageView缓存已调整大小的图像而不是原始图像

时间:2016-04-16 23:45:07

标签: android caching android-volley android-lru-cache networkimageview

我一直在努力进入Android开发世界,我一直在使用Volley和LruCache组建一个基本的新闻阅读器应用程序。

我有一个回收站视图,其中每个单元格都包含Volley库中的NetworkImageView。我可以点击那个单元格,它会打开另一个活动,这是一种细节视图,在单元格中显示更大版本的图像。我在NetworkImageView上使用setImageURL方法时使用相同的URL,但是对我来说很明显,NetworkImageView会将图像的大小附加到它用于在LruCache中缓存图像的密钥。这意味着即使URL相同,两个不同大小的NetworkImageViews也会创建两个网络调用而不是一个网络调用,并且一个调用缓存。

在某些方面,这是有道理的,为什么要缓存比您需要的图像更大的图像?但是,我想知道是否可以缓存原始图像而不是重新调整大小的图像?

我希望这是有道理的,谢谢,大卫。

1 个答案:

答案 0 :(得分:0)

ImageLoader的LruBitmapCache与http缓存(默认实现DiskBasedCache)不同。在lru缓存中,您将使用将要显示的大小来缓存eaxct位图,否则当您需要放入容器时,您需要在每个绑定时对图像数据阵列执行一些操作。然而,http缓存或DiskBasedCache缓存原始响应。

因此,无论如何你进行2次调用的原因可能是因为你的图像响应没有允许缓存的缓存头。但是,您可以更改此行为并强制执行缓存。您需要自定义ImageLoader,因为这是创建图像请求的人。你必须覆盖" makeImageRequest" :

      ...
mImageLoader = new ImageLoader(this.mRequestQueue,
                    new LruBitmapCache()) {
    @Override
        protected Request<Bitmap> makeImageRequest(String requestUrl, int maxWidth, int maxHeight,
                    ScaleType scaleType, final String cacheKey) {
                return new ImageRequest(requestUrl, new Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                        onGetImageSuccess(cacheKey, response);
                    }
                }, maxWidth, maxHeight, scaleType, Config.RGB_565, new ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        onGetImageError(cacheKey, error);
                    }
                }){
          @Override
                    public Response<Bitmap> parseNetworkResponse(NetworkResponse response) {
                        Response<Bitmap> resp = super.parseNetworkResponse(response);
                        if(!resp.isSuccess()) {
                    return resp;
                }
                long now = System.currentTimeMillis();
                Cache.Entry entry = resp.cacheEntry;
if(entry == null) {

    entry = new Cache.Entry();
    entry.data = response.data;
    entry.responseHeaders = response.headers;
}
entry.ttl = now + 30l * 24 * 60 * 60 * 1000;  //keeps cache for 30 days
entry.softTtl = now + 24 * 60 * 60 * 1000; // keeps valid(no refresh) for 1 day
                            return Response.success(resp.result, entry);
                        }

        };
            }
};
    ...
相关问题