react-native 热更新 重启(android)
2018-07-27 本文已影响33人
suphu
不用杀死进程重启应用,可以重新加载JS代码,重启页面。
private void loadBundle() {
final ReactInstanceManager instanceManager;
try {
instanceManager = resolveInstanceManager();
if (instanceManager == null) {
return;
}
//获取本地的js代码 这里就不给出代码了。 如果本地没有就返回assets目录的
String latestJSBundleFile = Utils.getJSBundleFileInternal();
setJSBundle(instanceManager, latestJSBundleFile);
new Handler(Looper.getMainLooper()).post(new Runnable() {
@Override
public void run() {
try {
instanceManager.recreateReactContextInBackground();
} catch (Exception e) {
// The recreation method threw an unknown exception
// so just simply fallback to restarting the Activity (if it exists)
loadBundleLegacy();
}
}
});
} catch (Exception e) {
e.printStackTrace();
loadBundleLegacy();
}
}
private ReactInstanceManager resolveInstanceManager(){
ReactInstanceManager instanceManager;
final Activity currentActivity = getCurrentActivity();
if (currentActivity == null) {
return null;
}
ReactApplication reactApplication = (ReactApplication) currentActivity.getApplication();
instanceManager = reactApplication.getReactNativeHost().getReactInstanceManager();
return instanceManager;
}
private void setJSBundle(ReactInstanceManager instanceManager, String latestJSBundleFile) throws IllegalAccessException {
try {
JSBundleLoader latestJSBundleLoader;
if (latestJSBundleFile.toLowerCase().startsWith("assets://")) {
latestJSBundleLoader = JSBundleLoader.createAssetLoader(getReactApplicationContext(), latestJSBundleFile, false);
} else {
latestJSBundleLoader = JSBundleLoader.createFileLoader(latestJSBundleFile);
}
Field bundleLoaderField = instanceManager.getClass().getDeclaredField("mBundleLoader");
bundleLoaderField.setAccessible(true);
bundleLoaderField.set(instanceManager, latestJSBundleLoader);
} catch (Exception e) {
throw new IllegalAccessException("Could not setJSBundle");
}
}
private void loadBundleLegacy() {
Logger.d("loadBundle #3 loadBundleLegacy...");
final Activity currentActivity = getCurrentActivity();
if (currentActivity == null) {
// The currentActivity can be null if it is backgrounded / destroyed, so we simply
// no-op to prevent any null pointer exceptions.
return;
}
currentActivity.runOnUiThread(new Runnable() {
@Override
public void run() {
currentActivity.recreate();
}
});
}