java.lang.AssertionError

问题

在新版集成 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 中调用。

你可能感兴趣的:(java.lang.AssertionError)