반응 적 네이티브로 화면 (채팅)이 적은 하이브리드 앱을 만들었습니다. 나는 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에 정적 참조로 메모리 누수가 발생할 수있는 생각과 비슷합니다. 놀랍게도 메모리 모니터의 분석기 작업을 실행할 때 메모리 누수가 표시되지 않습니다.
누구에게도이 제안이 있습니까? 정적 참조를 사용해도 괜찮습니까? 내 활동을로드 할 때마다 반응 앱의로드 시간을 최적화하는 다른 방법이 있습니까?
감사합니다.
물론 당신의 "활동을 유지하지 않는다"로 테스트? 아니? 그렇다면 당신은 ... – Selvin
솔직히, 나는 그런 선택을 전혀 몰랐다. 당신 덕분에 방금 테스트했는데 모든 것이 잘 작동하는 것 같습니다. – ggsrivas
제안 사항이 있으십니까? – ggsrivas