【问题标题】:Should Android React Native ReactRootView use Activity or Application context?Android React Native ReactRootView 应该使用 Activity 还是 Application 上下文?
【发布时间】:2018-03-19 22:22:50
【问题描述】:

在 React Native documentation for integrating with Android 中,它包含了这个用于与 Android 集成的 sn-p:

@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 更改我的上下文源是否安全,这是一个应该 a) 修复还是 b) 应该看到文档更改的错误?

【问题讨论】:

  • 有趣的问题。你有什么发现吗?
  • 确实是一个有趣的问题。我观察到同样的事情——取消 RN 对活动破坏的看法并没有帮助。这对我来说闻起来像个虫子;你应该考虑opening an issue。使用应用上下文作为解决方法似乎没有不良影响。
  • 你找到什么了吗?
  • @esilver 你是如何测试这个内存泄漏的?我没有在较新的版本 (.61+) 中看到这种情况,但也许我没有正确测试。
  • 也许这在较新的版本中有所改变。我的经验是,如果/当您的 Android 应用程序开始泄漏整个活动时,您将没有太多时间在整个应用程序崩溃之前,所以这是我泄漏的最初线索。一般来说,为了测试,我在 Activity 中的 onDestroy() 中放置一个断点,看看它是否在 Activity 关闭时被调用。

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


【解决方案1】:

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

请参阅 this article 了解不同的上下文功能。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-01-25
    • 1970-01-01
    • 2021-04-10
    • 1970-01-01
    • 2017-02-13
    • 2019-07-06
    • 2019-11-29
    • 2016-09-12
    相关资源
    最近更新 更多