android - 如何提高混合应用程序中 React Native View 的加载时间

标签 android performance memory-leaks react-native

我创建了一个混合应用程序,其中很少有屏幕(聊天)是用 React Native 编写的。我遵循了 react-native integration with existing app 指南,并创建了一个 Activity 以在创建我的 android Activity 时启动 react 应用程序。 我的 Activity 代码看起来类似于,

public class MyReactActivity extends Activity implements 
    DefaultHardwareBackBtnHandler {
    private ReactRootView mReactRootView;
    private ReactInstanceManager mReactInstanceManager;

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

        mReactRootView = new ReactRootView(getApplication());
        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);
    }

    @Override
    public void invokeDefaultOnBackPressed() {
      super.onBackPressed();
   }
}

这种方法的问题在于,每次创建 MyReactActivity 时都会创建 React 应用程序,并且此过程需要 1-2 秒。即使用户按下返回并返回此 Activity ,它也会再次启动 react 应用程序。我想减少这个加载时间。

如果我稍微修改上面的代码并将 ReactRootView 和 ReactInstanceManager 更改为静态。每次我创建 Activity 时,它都使用相同的 ReactRootView 和 InstanceManager。这肯定会缩短我的 Activity 的加载时间,但可能会导致性能不佳。新的 Activity 代码类似于,

public class MyReactActivity extends Activity implements 
    DefaultHardwareBackBtnHandler {
    private static ReactRootView mReactRootView;
    private static ReactInstanceManager mReactInstanceManager;

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

        if(mReactRootView != null) {
            return;
        }
        mReactRootView = new ReactRootView(getApplication());
        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);
    }

    @Override
    public void onStart() {
       super.onStart();
       setContentView(mReactRootView);
    }

    @Override
    protected void onStop(){
      if (mReactRootView != null) {
          ViewGroup parent = (ViewGroup) mReactRootView.getParent();
          if(parent != null) {
              parent.removeView(mReactRootView);
          }
      }
      super.onStop();
   }

    @Override
    public void invokeDefaultOnBackPressed() {
      if (mReactRootView != null) {
          ViewGroup parent = (ViewGroup) mReactRootView.getParent();
          if(parent != null) {
              parent.removeView(mReactRootView);
          }
      }
      super.onBackPressed();
   }
}

这种方法似乎工作正常,但我认为,它可能会导致内存泄漏,因为对 ReactRootView 和 ReactInstanceManager 的静态引用将始终将它们保存在内存中。令人惊讶的是,当我运行内存监视器的分析器任务时,我没有看到任何内存泄漏。

有人对此有什么建议吗?使用静态引用可以吗?每次我加载我的 Activity 时,是否有任何其他方法可以优化 React 应用程序的加载时间?

谢谢!

最佳答案

您采用的方法方向正确。

文档提到您可以使用 singleton 拥有一个 ReactInstanceManager 实例。 :

A ReactInstanceManager can be shared amongst multiple activities and/or fragments. You will want to make your own ReactFragment or ReactActivity and have a singleton holder that holds a ReactInstanceManager. When you need the ReactInstanceManager (e.g., to hook up the ReactInstanceManager to the lifecycle of those Activities or Fragments) use the one provided by the singleton.

https://reactnative.dev/docs/integration-with-existing-apps

关于android - 如何提高混合应用程序中 React Native View 的加载时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46749039/

相关文章:

java - Android:NoSuchMethodError 接口(interface)中有静态方法(使用 Retrolambda)

performance - 平均处理速度越来越慢

multithreading - 使用 OpenMP 时发生内存泄漏

ios - 在ios中NSString = NSString会导致内存泄漏吗?

android - 在为无名 JSONObject 解析 JSONArray 时如何停止 for 循环?

android - Theme.AppCompat.DayNight 不适用于 Android Lollipop

android - 使用 Kotlin compile daemon 编译不成功

java - 执行操作的最佳时间 : within, 或循环后

javascript - TypeScript 性能(asm.js、闭包编译器)和开销

iphone NSSearchPathForDirectoriesInDomains 内存泄漏?