缓存位图-Android



我有一个ListView,其中每个单元格都包含一个从互联网下载的位图。为了避免内存不足的错误,我想知道处理这个问题的最佳方法是什么。

我已经查看了位图的软引用,但我想知道如果我在当前活动中,并且应用程序开始耗尽内存,会发生什么。它如何决定回收哪些位图?

是否有更好的方法将文件写入磁盘,并在需要时将其加载到内存中?有什么例子吗?

感谢

我刚才处理过这个问题。也进行了性能试验。这是我得到的
这个答案超出了延迟加载图像的范围,因为它涉及性能。

首先:忘记android上的SoftReferences。由于行为不端(很快发布),缓存非常糟糕。我最终使用了LruCache(API的源代码<12),该缓存具有固定的字节大小。

当通过网络加载图像时,您希望保留加载的图像(在私人应用程序数据文件夹或SD卡中)。否则,用户将被迫在每次应用程序启动时加载(不必要的)数据。程序如下:

  1. 请求图像
  2. 检查内存缓存中的图像(跳到6。如果可用)
  3. 在本地持久化(跳转到5。如果是)
  4. 从网络加载并持久化
  5. 将位图加载到缓存中
  6. 将位图从缓存加载到视图中

现在来说说表演。如果每个列表项都有另一个图像,并且它们具有固定的大小(例如40 x 40 dip),则在加载完整图像(例如800 x 600 px)时会浪费缓存,并且您的设备将不得不计算大量的缩放量。

第一种解决方案是在将图像加载到高速缓存之前,在步骤5.上对位图进行预缩放。当您保持缩放后的图像并在下次加载时,您将获得最佳性能。

你可以在我的CoverCache助手中找到一个例子(CD封面-但可以用于任何类型的图像数据)。它同时处理图像的持久化、缩放和缓存。

有很多列表视图的实现,通过convertView机制延迟加载图像并重用视图。例如,看看这里:ListView 中的图像加载缓慢

有相当多的解决方案。