我目前有一个带有自定义适配器的 ListView,它可以异步获取描述行内容的信息。每行的一部分是图像 URL,我计划异步下载然后显示。
我目前下载这些图片的策略计划是:
- 保留对下载的 Bitmap 对象的软引用缓存。
- 当调用 getView() 并且位图在缓存中时,直接为 ImageView 设置位图。
- 如果位图不在缓存中,则开始在单独的线程中加载它,下载完成后将其添加到缓存中并在适配器上调用 notifyDataSetChanged()。
我还计划在调用拥有 ListView 的 onDestroy() 方法(或者甚至可能在 onPause() 方法中)的 Activity 对象时终止挂起的下载,但最重要的是我想终止挂起的图像的下载当行离开屏幕时。我可能只会在短暂的延迟后实际取消下载,因此如果该行再次快速出现在屏幕上,可以恢复下载而不会浪费带宽。
但是,我不确定一些事情:
- 检测某行何时离开屏幕以便取消下载的最佳方法是什么?
- 下载完成后调用 notifyDataSetChanged() 是最好的做法还是有更好的方法?
如果对整个策略有任何意见,我们将不胜感激。
最佳答案
我不认为真的需要调用 notifyDataSetChanged()...我会这样做:
- 在创建/更新时将 URL 作为标签存储在 View 中
- 在下载器线程(异步任务???)中注册一个监听器,用于下载保持对 View 和 URL 的引用
- 每当异步下载图像时,我都会在 View 中检查 TAG,如果它匹配 - 我会更新 ImageView(在 UI 线程中执行此操作很重要,但在使用异步任务时会给出)。图片也应该存储在 SD 卡上(每次请求 URL 时,您应该检查它是否尚未下载)。
- 每次 getView() 重用 View (传递的 View 不为空)时,我都会检查标签(旧 URL),将其替换为新 URL 并取消旧 URL 的下载。
我想差不多就可以了(可能会发生一些极端情况)...
关于android - ListView异步图片加载策略,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6486038/