0

反応のネイティブで少数の画面(チャット)が書かれたハイブリッドアプリを作成しました。私はreact-native integration with existing appガイドラインに従っており、アンドロイド活動が作成されたときに反応を開始するアクティビティを作成しました。 マイアクティビティコードは、のようになります。このアプローチでハイブリッドアプリで反応したネイティブビューの読み込み時間を改善する方法

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

答えて

1

あなたが従うアプローチは正しい方向です。

ドキュメントは、あなたがsingletonを使用して単一ReactInstanceManagerインスタンスを持つことができることを言及:

A ReactInstanceManagerは、複数の活動および/またはフラグメントの間で共有することができます。独自のReactFragmentまたはReactActivityを作成し、ReactInstanceManagerを保持するシングルトンホルダーが必要です。 ReactInstanceManagerが必要な場合(ReactInstanceManagerをアクティビティやフラグメントのライフサイクルに接続するなど)、シングルトンで提供されているものを使用します。

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

関連する問題