Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何提高混合应用程序中react本机视图的加载时间_Android_Performance_React Native_Memory Leaks_React Native Android - Fatal编程技术网

Android 如何提高混合应用程序中react本机视图的加载时间

Android 如何提高混合应用程序中react本机视图的加载时间,android,performance,react-native,memory-leaks,react-native-android,Android,Performance,React Native,Memory Leaks,React Native Android,我创建了一个混合应用程序,其中很少有屏幕(聊天)是用react native编写的。我遵循了与现有应用程序集成的react原生指南,并创建了一个活动,在创建android活动时启动react应用程序。 我的活动代码类似于 public class MyReactActivity extends Activity implements DefaultHardwareBackBtnHandler { private ReactRootView mReactRootView;

我创建了一个混合应用程序,其中很少有屏幕(聊天)是用react native编写的。我遵循了与现有应用程序集成的
react原生指南,并创建了一个活动,在创建android活动时启动react应用程序。
我的活动代码类似于

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();
   }
}
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();
   }
}
这种方法的问题是,每次创建
MyReactActivity
时,都会创建React应用程序,此过程需要1-2秒。即使当用户按下返回键并返回此活动时,它也会再次启动react应用程序。我想减少这个加载时间

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

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();
   }
}
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的静态引用将始终将它们保留在内存中。令人惊讶的是,当我运行内存监视器的analyzer任务时,我没有看到任何内存泄漏

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


谢谢

你所遵循的方法是正确的

文档中提到,您可以使用以下方法拥有单个ReactInstanceManager实例:

ReactInstanceManager可以在多个活动和/或片段之间共享。您将希望创建自己的ReactFragment或ReactActivity,并拥有一个保存ReactInstanceManager的单例持有者。当您需要ReactInstanceManager(例如,将ReactInstanceManager连接到这些活动或片段的生命周期)时,请使用singleton提供的


当然,您可以打开“不要继续活动”来测试它?不那么你应该……老实说,我不知道有这样的选择。多亏了你,我刚刚进行了测试,一切似乎都很好。有什么建议吗?