使用DiskBasedCache时无法加载Android Volley ListView图像

时间:2014-05-19 12:37:50

标签: android listview caching disk android-volley

我有一个应用程序,可以在列表视图中的每个项目上加载图像,我使用Volley让我的生活更轻松;如果之前已经下载了图像,我需要从磁盘加载图像。

问题:它不会工作。它需要重新下载图像。即使退出应用程序,我也需要保存图像。

奇怪:它仅适用于一个特定图像(并且与尺寸无关)!

我使用的是什么:我使用此网站对此进行了模式化:https://github.com/rdrobinson3/VolleyImageCacheExample

我也试过这个:http://howrobotswork.wordpress.com/2013/06/02/downloading-a-bitmap-asynchronously-with-volley-example/

守则:

String godzilla = "http://vineland.pynchonwiki.com/wiki/images/c/cf/Godzilla.jpg";

//String meme = "http://upload.wikimedia.org/wikipedia/en/d/d7/Meme_Many_Journeys.jpg";
ImageCacheManager.getInstance().getImageLoader().get(godzilla, new ImageLoader.ImageListener() {
    @Override
    public void onResponse(ImageLoader.ImageContainer imageContainer, boolean b) {
           viewHolder.backgroundImage = imageContainer.getBitmap();
           updateBackgroundImage(viewHolder,  viewHolder.backgroundImage, object);
           updateLayoutAlignmentParams(viewHolder);
    }

    @Override
    public void onErrorResponse(VolleyError volleyError) {

    }
});
if(viewHolder.backgroundImage != null)
    updateBackgroundImage(viewHolder, viewHolder.backgroundImage, object);

我已经尝试过meme网站,但仍然存在问题。我有一个特定的网站,其中包含奇怪的图像。这让人更加困惑。

编辑:其他信息,似乎将lruEntries添加为lruEntries.remove时出错(在completeEdit()上调用了entry.key。

1 个答案:

答案 0 :(得分:3)

Volley在图像方面有2个缓存层:

  1. L1级别:ImageLoader构造函数中由提供的内存缓存
  2. L2级别:磁盘缓存,由同一RequestQueue执行的每个请求共享。
  3. 除非请求明确请求,否则磁盘缓存会缓存每个响应。但是,缓存是根据响应的 HTTP缓存标头执行的。

    当您请求图像时,这就是Volley所做的:

    1. 检查L1缓存中的图像。如果找到则返回。
    2. 图像不在内存中 - 检查L2缓存。如果发现检查缓存标头的到期时间。如果仍然有效,请添加到L1缓存并返回图像。
    3. 图像不在磁盘上(不存在或已过期) - 执行网络请求。缓存磁盘缓存中的响应和内存缓存中的位图并返回。
    4. 我敢打赌,从磁盘加载的图像有缓存标题。

      IMO,您有3个选择:

      1. 图像服务器是您的 - 添加适当的缓存标头。
      2. 图像服务器不属于你 - 接受一些图像不会缓存在磁盘上的事实。
      3. 覆盖缓存政策以更好地满足您的需求。这意味着要编辑Volley源代码。