2012-01-27 52 views
2

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

我已经看过位图的softreferences,但我想知道如果我在当前的活动和应用程序开始用尽内存会发生什么。它如何决定要回收的位图?

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

感谢

+0

检查此链接http://stackoverflow.com/questions/1919679/android-listiem-recycle-while-scroll-up-or-down和这一个也许虽然它是关闭http://stackoverflow.com/questions/541966/android-how-do-i-do-a-lazy-load-of-images-in-listview – 2012-01-27 17:01:03

回答

7

我刚刚处理了一段时间。也用性能进行实验。这是我得到的。
此答案超出lazy loading of images,因为它涉及性能。

首先:在android上忘记SoftReferences。由于行为不当(很快就会发布)对缓存非常不利。我结束了使用LruCachesource for API < 12)的缓存的固定字节大小。

当通过网络加载图片时,您希望持久加载的图片(在私人应用程序数据文件夹或SD卡中)。否则,用户将被迫在每次应用启动时加载(不必要的)数据。这里的例行:

  1. 图像请求
  2. 支票图像在内存缓存(跳转到6如果可用)
  3. 的(如果是的话跳到5)坚持本地网络从
  4. 负荷和从缓存中坚持
  5. 负载位图入高速缓存
  6. 负载位图到图

现在说一些表现的话。如果每个列表项目都有另一个图像并且它们具有固定大小(例如40 x 40 dip),那么当加载完整图像时(例如800 x 600 px),您将浪费高速缓存内存,并且设备必须计算大量缩放比例。

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

您可以在我的CoverCache助手(CD封面 - 但可用于任何类型的图像数据)中找到示例。它同时处理持续,缩放和缓存图像。

1

有很多实现与图像的延迟加载与通过convertView mecanism意见重用列表视图的。例如,看看这里:Lazy load of images in ListView

这里有很多解决方案。

+0

我已经是懒加载图像,但问题是如何处理情况时,有太多的图像,因为手机会收到一个内存不足的例外。滚动应该不会强制回收位图,因为那样它将不得不重新下载它,这将提供不良的用户体验 – mirugai 2012-01-27 17:09:38

+0

您是否也在使用convertview? – Yahel 2012-01-27 17:46:04