dim.red
下面是一个简单的一个 Fragment 的例子
public class DemoFragment extends AutoTrackFragment {
private View mView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
mView = inflater.inflate(R.layout.fragment_demo, container, false);
return mView;
}
}
这样写会不会有问题呢?
答案是肯定的,确实有点问题.问题出在
当你的 DemoFragment 生命周期比 View 的生命周期长的时候.这样场景比如我们使用 ViewPager
控件使用FragmentPagerAdapter
作为适配器.用 Fragment
管理 View.
我们都知道 ViewPager 在不额外的设置下.是缓存Fragment和前后2页的 Fragment. 不在这个的范围Fragment 中的 View 会被剥离界面.正常情况当 gc 的时候View 是会被回收的.但是如果是你这样写的话.会导致 DemoFragment 持有这个 View . 导致这个 View 不会被回收.导致本该回收的 View 超出了预计的生命周期.
那什么时候View 会被回收呢?
当 ViewPager滑回来以后.重新触发onCreateView 构建了新的 View.然后DemoFragment会持有新的 View. 旧的 View 就会被释放. gc 来了旧的 View 才会被回收了.
修正方法:
在onDestroyView 将所有持有的 View 都置为 null;