您的位置:首页 > 其它

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

2016-05-26 01:22 477 查看
如果在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()
...
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: