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

问题描述:

我已经创建了一个混合应用程序,其中很少屏幕(聊天)以原生方式编写。我遵循react-native integration with existing app准则,并创建了一个活动,以在我的android活动创建时启动反应应用程序。 我的活动代码类似于,如何提高在混合应用程序中反应本机视图的加载时间

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创建这个过程需要1-2秒。即使用户按回来并返回到此活动,它也会再次启动应用程序。我想减少这个加载时间。

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

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将永远保留在内存中。令人惊讶的是,当我运行内存监视器的分析任务时,我没有看到任何内存泄漏。

有没有人有任何建议呢?可以使用静态引用吗?每次加载我的活动时,是否有其他方式可以优化反应应用程序的加载时间?

谢谢!

+0

当然,你的“不保留活动”测试吗?没有?那么你应该... – Selvin

+0

老实说,我没有意识到任何这样的选择。感谢你我刚刚测试过,一切似乎都正常。 – ggsrivas

+0

有什么建议吗? – ggsrivas

您所遵循的方法是正确的。

该文档提到,则可以使用一个singleton具有单ReactInstanceManager实例:

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

https://facebook.github.io/react-native/docs/integration-with-existing-apps.html