我目前正在使用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正在下载的图像,并将其用于我需要的所有不同尺寸,而不是必须为同一图像制作另一个网络请求但尺寸不同?
由于
答案 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.