【问题标题】:Android Volley Image Caching Different Size BitmapsAndroid Volley 图像缓存不同大小的位图
【发布时间】:2015-09-03 10:40:12
【问题描述】:

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

谢谢

【问题讨论】:

    标签: android image caching bitmap android-volley


    【解决方案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 键的图像。这会损失一些速度,因为 ImageView 必须做一些工作来调整图像的大小,但现在我们不必为同一个 Image 发出网络请求。

    【讨论】:

    • 你可以用更简单的方式来做这个:imageLoader.get(url, ImageLoader.getImageListener(imageView, defaultDrawable, errorDrawable));
    【解决方案2】:

    假设您使用的是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。

    【讨论】:

      猜你喜欢
      • 2017-01-19
      • 1970-01-01
      • 2013-10-24
      • 2014-03-17
      • 1970-01-01
      • 1970-01-01
      • 2017-10-17
      • 2011-03-06
      相关资源
      最近更新 更多