2011-06-26 160 views
8

我目前有一个ListView与自定义适配器,它可以异步获取描述行内容的信息。每行的一部分是一个图像URL,我打算异步下载并显示。ListView异步图像加载策略

我目前的计划为战略,以下载这些图片是:

  • 保持软引用的高速缓存下载的位图对象。
  • 当调用getView()并且位图位于缓存中时,直接设置ImageView的位图。
  • 如果位图不在缓存中,请在下载完成后将其加载到单独的线程中,然后将其添加到缓存并在适配器上调用notifyDataSetChanged()。

我还计划杀死时,活动对象拥有ListView的的onDestroy()未处理的下载 - (甚至在的onPause()或可能 - 法)方法被调用,但最重要的是我要杀死下载当行离开屏幕时,待处理图像的状态。我可能实际上只是在短暂的延迟后取消下载,所以如果行再次快速出现在屏幕上,它可以在不浪费带宽的情况下恢复。

我,不过,我不确定的几件事:

  • 什么是当行熄灭屏幕,所以我可以取消下载,以检测的最佳方式?
  • 调用notifyDataSetChanged()是下载完成后还是有更好的方法?

对整个策略的任何意见,将不胜感激。

回答

8

我不认为调用notifyDataSetChanged()是真正需要的...我不喜欢它,取消下载:

  • 商店网址为创建视图时标签/更新
  • 下载保存参考视图图像时的异步下载的URL
  • 登记在下载线程监听器(异步任务???) ,我检查了TAG视图,如果它匹配 - 我会更新ImageView(在UI线程中很重要,但在使用异步任务时会给出)。图像也应该存储在SD卡上(并且每次请求URL时,都应检查它是否已经下载)。
  • 每当getView()重用视图(传递视图不为空)时,我会检查标记(旧URL),将其替换为新URL并取消oldURL的下载。

我认为这是相当多了(某些极端情况可能会发生)......

+0

我想到的一个角落案例是,一排可能会离开屏幕,永远不会被重用。然后,我永远不会有机会取消下载。 – JPvdMerwe

+0

相当不可能。这些视图被ListView非常严格地重用......它可能只是“稍微偏离屏幕”(视图在屏幕后移动1像素时不会立即重用),但这实际上可能会使您获得“short延迟“行为是免费的。 –

3

我使用getFirstVisible和getLastVisible适配器视图性能检测可见行,并把要求在一个固定大小的堆栈。

我的项目是开源的,有一个最宽松的许可证,如果你想使用它: https://github.com/tbiehn/Android-Adapter-Image-Loader

-Travis