【问题标题】:Android Volley ListView Images Not Loading When Using DiskBasedCache使用 DiskBasedCache 时未加载 Android Volley ListView 图像
【发布时间】:2014-07-07 10:13:24
【问题描述】:

我有一个应用程序可以在列表视图的每个项目上加载图像,我使用 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(entry.key 正在 completeEdit() 上调用时出错。

【问题讨论】:

  • 我正在搜索有关 volley DiskBasedCache 的信息,我看到了您的帖子,我遇到了 DiskBasedCache 的问题。我已经能够将它缓存在内存中,是否可以提供一个简单的示例来说明如何为图像添加内存缓存和基于磁盘的缓存?

标签: android listview caching disk android-volley


【解决方案1】:

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

  1. L1 级别:ImageLoader 构造函数中的内存缓存由您提供
  2. L2 级别:一个磁盘缓存,由同一个RequestQueue 执行的每个请求共享。

除非请求明确要求,否则磁盘缓存会缓存每个响应。但是,缓存是根据响应的 HTTP 缓存标头进行的。

当您请求图像时,Volley 会这样做:

  1. 检查 L1 缓存中的图像。如果找到则返回。
  2. 图像不在内存中 - 检查 L2 缓存。如果找到,请检查缓存标头是否过期。如果仍然有效,则添加到 L1 缓存并返回图像。
  3. 图像不在磁盘上(不存在或已过期)- 执行网络请求。将响应缓存在磁盘缓存中,将位图缓存在内存缓存中并返回。

我敢打赌,从磁盘加载的图像有缓存头。

IMO,您有 3 个选择:

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

【讨论】:

  • 天啊!你太棒了!这完全解决了我的问题!但现在我想我需要为选项 3 设置 Response 对象。
  • 好吧,最后一个问题:我是用gradle导入Volley库的,由于我没有直接访问源代码,实在没法修改HttpHeaderParser.parseIgnoreCacheHeaders() ,并且我当前的实现都没有使用它。

    有没有办法解决这个问题,还是我真的必须使用源代码并将其作为库引用? (因为我有点担心以后对库的修复,然后我需要更新整个源代码)

    对于这些问题,我深表歉意。 :D
  • 据我所见,没有其他办法。如果它有帮助,我自己已经完成了,到目前为止 Volley 更新很少而且非常小,所以它没有问题。
猜你喜欢
  • 1970-01-01
  • 2017-12-31
  • 1970-01-01
  • 1970-01-01
  • 2012-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多