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