Fragment 的 View 的正确声明方式

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;

    原文作者:轻微
    原文地址: https://www.jianshu.com/p/27576f058d8b
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞