关于Fragment.onCreate()中引用Activity.onCreate()创建的对象时的一个异常

Posted 爱搬砖的摄影师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于Fragment.onCreate()中引用Activity.onCreate()创建的对象时的一个异常相关的知识,希望对你有一定的参考价值。

如果在Fragment.onCreate()中引用Activity.onCreate()创建的对象,可能会抛空指针异常,这是因为Fragment.onCreate()可能会在Activity.onCreate()没执行完时就执行了,一般出现在Activity销毁再重建的情况下,这个时候可以把Fragment.onCreate()中的引用搬到Fragment.onActivityCreated()中。
FragmentActivity中onCreate()执行到最后会调用mFragments.dispatchCreate(),该方法实际上会调到FragmentManager.moveToState(),从而调到Fragment.performCreate(),这个方法中就会直接调Fragment.onCreate()。

@SuppressWarnings("deprecation")
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) 
    mFragments.attachHost(null /*parent*/);

    super.onCreate(savedInstanceState);

    NonConfigurationInstances nc =
            (NonConfigurationInstances) getLastNonConfigurationInstance();
    if (nc != null) 
        mFragments.restoreLoaderNonConfig(nc.loaders);
    
    if (savedInstanceState != null) 
        Parcelable p = savedInstanceState.getParcelable(FRAGMENTS_TAG);
        mFragments.restoreAllState(p, nc != null ? nc.fragments : null);
    
    mFragments.dispatchCreate();
public void dispatchCreate() 
    mStateSaved = false;
    moveToState(Fragment.CREATED, false);
void moveToState(Fragment f, int newState, int transit, int transitionStyle,
            boolean keepActive) 
    ...
    if (!f.mRetaining) 
        f.performCreate(f.mSavedFragmentState);
    
    ...
void performCreate(Bundle savedInstanceState) 
    ...
    onCreate(savedInstanceState);    // fragment中的onCreate()
    ...

以上是关于关于Fragment.onCreate()中引用Activity.onCreate()创建的对象时的一个异常的主要内容,如果未能解决你的问题,请参考以下文章

重新加载 Fragment 时多次调用 Fragment onCreate

关于java中对象引用的理解?

python 05 关于对python中引用的理解

关于引用PagerSlidingTabStrip无法引用的问题

关于扩展运算符中i++和++i,以及基本类型和引用类型的综合应用

关于“引用”的那些事儿