android - ListView异步图片加载策略

标签 android listview

我目前有一个带有自定义适配器的 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/

相关文章:

android - 背景为 Android 中的 AnimationDrawable 的按钮状态

java - 无法使用 baseadapter 解析带有 listview 的构造函数适配器

java - Android Checkable ListView 项目保持选中状态

listview 中的 asp.net 复选框调用 javascript 代码 onchange

android - ListView 的高度填满整个屏幕,尽管设置为 wrap_content

android - Proguard 不会混淆 gui 组件

android - Mp Android Chart 从右到左滚动数据

android - 后台服务发布的事件没有订阅者

android - 一旦适配器类中的数据发生更改,就更新 Activity 的 textview

android - 未知权限 android.permission.RECORD_VIDEO