问题
在新版集成 RN 的应用上线后(我是在Fragment中集成的RN),线上应用出现了大量的如下错误
java.lang.AssertionError
at com.facebook.infer.annotation.Assertions.assertNotNull(Assertions.java:28)
at com.facebook.react.ReactInstanceManager.onHostPause(ReactInstanceManager.java:515)
....
本地测试从来也没有出现过这种情况,具体去查找原因发现(源码)
@ThreadConfined(UI)
public void onHostPause(Activity activity) {
Assertions.assertNotNull(mCurrentActivity);
Assertions.assertCondition(
activity == mCurrentActivity,
"Pausing an activity that is not the current activity, this is incorrect! " +
"Current activity: " + mCurrentActivity.getClass().getSimpleName() + " " +
"Paused activity: " + activity.getClass().getSimpleName());
onHostPause();
}
发现是 mCurrentActivity为空,那么再去查找 mCurrentActivity 是如何赋值的,发现(源码)
@ThreadConfined(UI)
public void onHostResume(Activity activity, DefaultHardwareBackBtnHandler defaultBackButtonImpl) {
UiThreadUtil.assertOnUiThread();
mDefaultBackButtonImpl = defaultBackButtonImpl;
if (mUseDeveloperSupport) {
mDevSupportManager.setDevSupportEnabled(true);
}
mCurrentActivity = activity;
moveToResumedLifecycleState(false);
}
发现是调用 onResume 时赋值,就感觉很奇怪,按照我的理解来说 mCurrentActivity不可能为空。我是在 Fragment 的 onResume中调用
@Override
public void onResume() {
super.onResume();
mReactInstanceManager.onHostResume(getActivity(), this);
}
就感觉很奇怪。后来同事让我试试在 Activity 的 onPause 中调用 reactInstanceManager.onHostPause(this);,经过最新线上版本的验证。已经发现没有这个问题了。这里虽然解决了这个问题但是还是不知道是什么原因。
这里先做个笔记。
总结
调用 mReactInstanceManager中的生命周期相关方法, 尽量在 Activity 中调用,如果是在 Fragment 中调用,那就在 Fragment 的父 Activity 中调用。
网友评论