记录 viewpager + fragment 导致的内存泄漏解决方案
记录 viewpager + fragment 导致的内存泄漏解决方案
我的项目里面用到了 viewpager + fragment ,实现了多个页面左右滑动效果。使用过程中,leakCanary2 检测出了内存泄漏,可能存在泄漏的地方是存放 fagment 的集合 FragmentList。
尝试方案
既然内存泄漏指向了 FragmentList ,那就从它下手。
在页面销毁时,清空 fragment 集合,手动释放内存
void ondestroy(){ ... fragmentList.clear(); fragmentList = null; ... }
和预期的不一样,虽然手动释放集合,但是内存泄漏问题还在,一模一样。太难了。
网上的方案
- 通过 setOffscreenPageLimit() 感觉这种方法比较局限,适用于 fragment 少的情况。具体做法就是,比如有5个 fragment ,就设置为 5。我在自己项目中测试过,的确没与内存泄漏了。
- 通过 PagerAdapter
一般做法,都是通过集合保存 fragment 实例,然后传递到 adapter中。一直也这么做的,没想到会存在内存泄漏。
fragmentList.add(Fragment1.newInstance(0)); fragmentList.add(Fragment2.newInstance(1)); fragmentList.add(Fragment3.newInstance(2)); fragmentList.add(Fragment4.newInstance(3)); fragmentList.add(Fragment5.newInstance(4));
新的做法是,将 fragment 的初始化,交给 adapter。
@Override public Fragment getItem(int position) { switch (position) { case 0: return Fragment1.newInstance(position); case 1: return Fragment2.newInstance(position); case 2: return Fragment3.newInstance(position); case 3: return Fragment4.newInstance(position); case 4: return Fragment5.newInstance(position); default: throw new RuntimeException("Fragment 创建异常"); } }
以上就是 viewpager + fragment 内存泄漏的 2 个解决方案了,如果有其它方案,欢迎留言告知。
下一篇:
五个技巧,让你的抖音作品更加出色