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();
            }
        });
    }
上一篇下一篇

猜你喜欢

热点阅读