Android中的React Native ReactRootView应该使用Activity还是Application上下文?

10
在 React Native 的与 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%的可重现的内存泄漏问题,原因是ThemedReactContext持有对ReactRootView的引用,而ReactRootView又持有对我的自定义活动的引用。

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

相反,如果我执行以下操作:

mReactRootView = new ReactRootView(getApplication());

我没有发现内存泄漏。

更改ReactRootView的源是否安全,并且这是一个应该被修复或者应该更改文档的错误吗?


有趣的问题。你有找到任何相关资料吗? - ggsrivas
{btsdaf} - Petter Hesselberg
1
你有找到任何相关的东西吗? - kerry
@esilver 你是如何测试这个内存泄漏的?我在更新版本(.61+)中没有看到出现这种情况,但也许我没有测试得很好。 - dev
也许在新版本中已经改变了。我的经验是,如果您的Android应用程序开始泄漏整个Activity,那么在整个应用程序崩溃之前,您将没有太多时间,因此这是我最初发现自己正在泄漏的线索。通常,为了进行测试,我会在Activity的onDestroy()中设置一个断点,并查看在关闭活动时是否调用了该方法。 - esilver
1个回答

2
看起来上下文只用于初始化FrameLayout。从技术上讲,传递应用程序上下文将可以避免内存泄漏,但是样式可能会混乱,因为“填充将使用您正在运行的系统的默认主题,而不是在您的应用程序中定义的主题。”请参见此文章以了解不同上下文的功能。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接