关于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()
    ...
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值