记录 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 创建异常");
}
}