我有一个使用适配器填充 ImageView 列表的 ListView。我遵循以下标准做法:
a) 仅当 convertView 为空时才膨胀新视图,并且
b) 如果 convertView 不为空,则使用 viewHolder 避免调用 findViewById()
我还使用 AsyncTask 从数据库(或从磁盘缓存或 LRU 内存缓存,如果可能的话)填充 ImageViews。
一切都正常工作了一段时间(即,图像以平滑滚动填充在列表中),但我有一个泄漏,在加载大约 70 x 1.4M 图像后会出现 OOM 错误。
我的理解是,当 getView() 返回一个非空的 convertView 时,ListViews 会被回收,所以我不应该看到这样的内存堆积。就我而言,每次为 ImageView 分配位图时,应用程序的内存使用量都会增加。事实上,即使在我通过 list.clear() 清除了底层列表并通过 adapter.notifyDataSetInvalidated() 将适配器归零之后,Activity 仍保留此内存 - 两者都在 onStop() 函数中。
MAT 工具显示搁浅的位图和搁浅的 ImageView(加载图像时大约是一对一的),但我不知道是什么保存了会阻止对旧视图进行垃圾收集的引用。
我将不胜感激有关如何追踪此泄漏的任何建议。谢谢!