之前发现,ListView里面的图片资源越占越大,特别是当列表载入的图片相当大的时候,比如微博的中等图片大小,就非常难受.而log也可以看出,是图片没有回收,尽管相关的View已经不使用了,这就是doc里面说的内存泄露了.
因为ImageView里面关联着Bitmap.导致Bitmap没有办法释放,所以尽管ListView只是展示一部分内容(当前可见的部分),其它部分却没有办法回收.
还好,在AbsListView里面提供了一个RecyclerListener接口,客户端覆盖这个接口中的方法,手动回收Bitmap,就可以了.
默认这个不处理什么东西的.
@Override
public void onMovedToScrapHeap(final View view) {}
这个方法名可以看出是将View移入待回收区,
但是由于引用的问题,虚拟机无法在第一时间回收,要等到所有的引用都无效了.才会回收
如我在微博程序中的:
TagsViewGroup tagsViewGroup=itemView.mTagsViewGroup;
if (null!=tagsViewGroup) {
tagsViewGroup.setAdapter(null);
tagsViewGroup.removeAllViews();
}
将View清空了,就可以回收Bitmap了.
这一点很重要,当然还可以处理TextView,等占用资源多的View的回收,对于一个列表来说,加载大图,用这样的方法释放就可以了.
monitor里面heap测试,大约是在25m以内,而heapsize=64m的手机.
这样就可以避免以前在32m heap中配置中出现oome了.
引爆你的图片浏览,亮瞎你的眼睛.
引爆你的图片浏览, ListView 大图片
最新推荐文章于 2021-05-26 10:32:43 发布