Android Volley图像缓存不同大小的位图

时间:2015-06-17 23:58:49

标签: android image caching bitmap android-volley

我目前正在使用Volley Image Loader在我的应用中加载和缓存图像。缓存工作正常,但我发现当我尝试将相同的网络图像加载到不同大小的ImageView时,缓存不会被命中。我相信这是因为ImageLoader中的getCacheKey会将位图的大小附加到键中:

private static String getCacheKey(String url, int maxWidth, int maxHeight) {
    return (new StringBuilder(url.length() + 12)).append("#W").append(maxWidth).append("#H").append(maxHeight).append(url).toString();
}

如何保存Volley正在下载的图像,并将其用于我需要的所有不同尺寸,而不是必须为同一图像制作另一个网络请求但尺寸不同?

由于

2 个答案:

答案 0 :(得分:1)

看起来如果在不使用NetworkedImageView的情况下加载图像,则加载的图像将是完整图像。因此,我没有使用NetworkedImageView,而是加载了这样的图像:

getImageLoader().get(url, new ImageLoader.ImageListener() {
            @Override
            public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) {
                ((ImageView)view).setLocalImageBitmap(imageContainer.getBitmap());
            }

            @Override
            public void onErrorResponse(VolleyError volleyError) {

            }
        });

这将使用#W0#H0的键加载Image。这将失去一些速度,因为ImageView必须完成调整图像大小的工作,但现在我们不必为同一图像发出网络请求。

答案 1 :(得分:0)

假设您正在使用NetworkedImageView,如果两个布局参数都设置为WRAP_CONTENT,或者视图的宽度和高度恰好是,则Volley将只会触发URL的L1缓存图像与之前取得的相同。解决这个问题的一种方法是忽略宽度和高度:

private static String getCacheKey(String url, int maxWidth, int maxHeight) {

  return (new StringBuilder(url.length() + 12)).append(url).toString();
}

另一种方法是创建自己的NetworkedImageView子类,在请求之前将maxWidth和maxHeight设置为0.