ListView异步图像加载策略

JPv*_*rwe 8 android listview

我目前有一个带有自定义适配器的ListView,它可以异步地获取描述行内容的信息.每行的一部分是图像URL,我打算异步下载然后显示.

我目前计划下载这些图像的策略是:

  • 保留对下载的Bitmap对象的软引用缓存.
  • 调用getView()并且位图位于缓存中时,直接设置ImageView的位图.
  • 如果位图不在缓存中,则在下载完成后开始将其加载到单独的线程中,将其添加到缓存并在适配器上调用notifyDataSetChanged().

我也打算在调用拥有ListView的onDestroy() - 方法(或者甚至可能在onPause() - 方法中)的Activity对象时杀死挂起的下载,但最重要的是我要在行时删除挂起的图像的下载离开屏幕.我可能实际上只是在短暂的延迟后取消下载,所以如果行再次快速进入屏幕,它可以在不浪费带宽的情况下恢复.

但是,我不确定一些事情:

  • 什么是检测行何时离屏的最佳方法,以便我可以取消下载?
  • 在下载完成后调用notifyDataSetChanged()是最好的办法还是有更好的方法?

此外,对整个战略的任何评论都将不胜感激.

Jar*_*iuk 8

我不认为真的需要调用notifyDataSetChanged()...我会这样做:

  • 创建/更新时,在视图中将URL存储为标记
  • 在下载程序线程(async task ???)中注册一个监听器,以便下载保持对视图和URL的引用
  • 每当异步下载图像时,我在视图中检查TAG,如果匹配 - 我会更新ImageView(在UI线程中这很重要,但是在使用异步任务时,会给出它).图像也应存储在SD卡上(每次请求URL时,都应检查是否已下载).
  • 每当getView()重用视图(传递的视图不为空)时,我会检查标记(旧URL),将其替换为新URL并取消下载oldURL.

我认为它几乎就是它(某些角落可能会发生)......