关于Fragment生命周期异常的分析

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lj19851227/article/details/82252657

问题描述

最近在总结Activity和Fragment相关知识的时候遇到一个问题,就是首先通过动态方法在Activity的onCreate中添加Fragment,然后旋转屏幕观察Fragment的生命周期调用,发现每个方法都会被调用两次,很诡异,仔细思考了一下马上就找出了答案。

代码:

            getSupportFragmentManager()
                    .beginTransaction()
                    .add(new CustomFragment(),"CustomFragment")
                    .commit();

log如下:

    Line 46: 08-31 10:00:05.502 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onAttach
    Line 47: 08-31 10:00:05.502 13088-13088/com.android.peter.fragmentdemo D/peter.log.CustomFragment: onAttach tag = CustomFragment
    Line 48: 08-31 10:00:05.502 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onCreate
    Line 52: 08-31 10:00:05.542 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onCreateView
    Line 53: 08-31 10:00:05.554 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onActivityCreated
    Line 54: 08-31 10:00:05.555 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onAttach
    Line 55: 08-31 10:00:05.556 13088-13088/com.android.peter.fragmentdemo D/peter.log.CustomFragment: onAttach tag = CustomFragment
    Line 56: 08-31 10:00:05.556 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onCreate
    Line 57: 08-31 10:00:05.556 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onCreateView
    Line 58: 08-31 10:00:05.565 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onActivityCreated
    Line 59: 08-31 10:00:05.566 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onStart
    Line 60: 08-31 10:00:05.566 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onStart
    Line 69: 08-31 10:00:05.625 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onResume
    Line 70: 08-31 10:00:05.626 13088-13088/com.android.peter.fragmentdemo E/peter.log.CustomFragment: onResume

问题原因

log中生命周期方法被连续调用两次,最有可能的原因就是add了两个相同的Fragment。直接跳到Activity的onCreate方法静态代码分析,确实在屏幕旋转后会再次调用onCreate方法添加一次Fragment。

解决办法

在add之前先通过Fragment的tag判断是否被添加过了,如果add过了就不再添加。

        if(getSupportFragmentManager().findFragmentByTag("CustomFragment") == null) {
            getSupportFragmentManager()
                    .beginTransaction()
                    .add(new CustomFragment(),"CustomFragment")
                    .commit();
        }

或者直接判断savedInstanceState为空也可以。

小结

如果Fragment里面包含了复杂的逻辑,旋转多次,每次都会新添加一个Fragment,就会引发OOM问题。如果不是因为这次为了观察Fragment的生命周期就会忽略这个使用细节,导致其他未知问题。

猜你喜欢

转载自blog.csdn.net/lj19851227/article/details/82252657