【问题标题】:volley imageCache and imageRequest both cache the imagevolley imageCache 和 imageRequest 都缓存图像
【发布时间】:2014-06-23 05:59:48
【问题描述】:

我正在使用 volley 加载我的图像并缓存它们。

mImageLoader = new ImageLoader(getRequestQueue(context), mImageCache);

其中 mImageCache 是一个 DiskLruImageCache。

volley 通过 ImageRequest 从服务器获取图像,扩展 ImageRequest<Bitmap>

在请求类中有一个布尔值定义是否缓存响应

/** Whether or not responses to this request should be cached. */
private boolean mShouldCache = true;

并且ImageRequest 没有禁用mShouldCache

如您所见,默认值为 true,因此 volley 获取图像后会将其缓存在 volley 缓存目录下 diskBasedCache

所以现在我必须缓存一个来自ImageRequest 的位图和一个来自ImageLoader 的位图我如何禁用ImageRequest 缓存?或任何其他建议?

【问题讨论】:

  • 我认为你必须使用 AndroidQuery 库从服务器 url 加载图像,它提供了各种方式来处理来自服务器的缓存图像:code.google.com/p/android-query
  • 感谢图书馆,但我想坚持 volley

标签: android caching android-volley image-caching


【解决方案1】:

ImageLoader 一个磁盘缓存是错误的。 Volley 已经为每个响应提供了一个共享磁盘缓存,无论是不是图像,默认情况下都根据 HTTP 缓存标头工作。

您应该为ImageLaoder 提供一个内存位图缓存。查看文档。

原因在于 Volley 的设计方式。这是 Volley 的图像请求逻辑:

  1. 网址为 X 的图片已添加到队列中。
  2. 检查图像内存缓存(由您提供) - 如果可用,返回位图。 最快
  3. 检查共享磁盘缓存 - 如果可用,请检查缓存标头以查看该映像是否仍然有效。如果有效 - 添加到 memory 位图缓存并返回。 较慢,但仍然相当快
  4. 此步骤意味着图像在磁盘缓存中但其缓存标头丢失或过期,或者图像在缓存中根本不可用。无论哪种方式,Volley 都会执行网络请求并将响应缓存在两个缓存中。 最慢​​

因此,通过提供磁盘缓存 - 您既会减慢应用程序的速度,又会占用两倍的磁盘空间并节省冗余图像。

使用内存缓存。

【讨论】:

  • 但我需要一个 DiskLruCache !我通过自己创建一个新的 requestQueue 实例来解决这个问题,并将 NoCache 作为缓存传递并使用我自己的图像缓存!
  • 您不了解您正在使用的代码,并且可能不了解我的回答。如果您需要磁盘缓存,请编辑 Volley 源并更改磁盘缓存。 ImageLoader 需要内存缓存。如果你给它一个磁盘缓存,你会通过使用冗余磁盘空间来伤害你的应用程序和用户。
  • 但是 volleys diskBasedCache 缓存基于 httpHeader 的实体,我希望图像成为 LRU 缓存!有什么解决方法吗?
  • 编辑源。没关系。这就是它开放的原因。
猜你喜欢
  • 2013-10-24
  • 2014-03-17
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2017-01-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多