Fragment 的 View 的正确声明方式

作者: 轻微 | 来源:发表于2016-01-24 02:33 被阅读965次

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;

相关文章

网友评论

  • artshell:如果使用 Butterknife,解绑下就行

    @Override
    public void onDestroyView() {
    super.onDestroyView();
    if (mUnBinder != null) {
    mUnBinder.unbind();
    }
    }
  • 程序亦非猿:在ondestroy里 执行完super后再置为null 还是super之前?
    轻微:@程序亦非猿 onDestroyView 只是一个状态的回调, super 内部的方法只是对标示位的设置. 所以不管你在super前面还是super 后面都是一样的效果
  • 谢三弟: if (mainLayout == null) {

    mainLayout = (LinearLayout) inflater.inflate(R.layout.fragment_user, container, false);
    }

    我这样做的话有什么不好的吗?
    DevWang:@轻微 这样做省去了大量给view重新填值的代码 !我觉得如果是在主界面的tab下的fragment 完全可以这样做 提高页面显示效率
    轻微:@谢三哥 如果你要保存view 中的状态可以, 这个写的后果是一旦生成 View 要等 Fragment 回收才会回收.
  • Razerdp:哈哈,各种引用坑,有时候真的挺难发觉出来的。
    轻微:@羽翼君 弱引用也是可以,可是弄成弱引用,变得很麻烦诶. 回收的时候也没有置为 null 来得简单粗暴
    Razerdp:@羽翼君 话说回来,弱引用如何。
  • MarkZhai:阿明好牛逼
    轻微:@MarkZhai :joy: :joy: :joy: 心好虚
  • b097161c867f:那是否意味着凡是在 Fragment 的 onCreateView 和 onActivityCreated 中初始化的成员变量,在 onDestroyView 时都要置 null 咯?
    轻微:@ringdang 这里置为 null 是为了让View 可以被java 虚拟机回收,因为当再次回到这个位置的是时候vp 会重新创建View ,而其他变量并没有被回收的需求.
    b097161c867f:@轻微 不是同样的原理吗?有什么区别
    轻微:@ringdang 并不需要
  • MrFu:哈哈!谢谢谢谢~没注意,确实是这么写的,本来下周要发布了~回头去改掉去!
    轻微:@MrFu 哈哈😄

本文标题:Fragment 的 View 的正确声明方式

本文链接:https://www.haomeiwen.com/subject/lgprkttx.html