Android React Native ReactRootView应该使用Activity还是Application context?

时间:2017-10-08 17:37:54

标签: java android react-native memory-leaks react-native-android

在React Native documentation for integrating with Android中,它包含了与Android集成的代码段:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    mReactRootView = new ReactRootView(this);
    mReactInstanceManager = ReactInstanceManager.builder()
            .setApplication(getApplication())
            .setBundleAssetName("index.android.bundle")
            .setJSMainModulePath("index")
            .addPackage(new MainReactPackage())
            .setUseDeveloperSupport(BuildConfig.DEBUG)
            .setInitialLifecycleState(LifecycleState.RESUMED)
            .build();
    mReactRootView.startReactApplication(mReactInstanceManager, "MyReactNativeApp", null);

    setContentView(mReactRootView);
}

然而,当我按原样使用时,我会得到一个100%的repro内存泄漏,因为ThemedReactContext持有ReactRootView的引用,该引用包含对我的自定义活动的引用。

这是因为传递给Context的构造函数的ReactRootView参数是this,这是对我的自定义活动的引用。

相反,如果我这样做:

mReactRootView = new ReactRootView(getApplication());

我没有内存泄漏。

为新的ReactRootView更改我的上下文源是否安全,这是一个错误,应该a)修复还是b)应该看到文档发生变化?

1 个答案:

答案 0 :(得分:0)

看起来上下文仅用于初始化FrameLayout。从技术上讲,在应用程序上下文中进行传递将可以避免内存泄漏,但是由于“膨胀将使用您所运行的系统的默认主题而不是应用程序中定义的主题来完成,因此,样式可能会弄乱。”

有关不同的上下文功能,请参见this article