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를 static으로 변경하십시오. 내 활동을 만들 때마다 동일한 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 인스턴스를 가질 수 있음을 언급 :

ReactInstanceManager 여러 활동 및/또는 조각 사이에 공유 할 수 있습니다. 자신 만의 ReactFragment 또는 ReactActivity를 만들고 ReactInstanceManager를 보유하는 단일 소유자를 원할 것입니다. ReactInstanceManager가 필요할 때 (예 : ReactInstanceManager를 해당 활동 또는 단편의 라이프 사이클에 연결하려면) 싱글 톤에서 제공 한 것을 사용하십시오.

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

관련 문제