美文网首页
react-native 热更新 重启(android)

react-native 热更新 重启(android)

作者: suphu | 来源:发表于2018-07-27 11:45 被阅读33次
    不用杀死进程重启应用,可以重新加载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();
                }
            });
        }
    

    相关文章

      网友评论

          本文标题:react-native 热更新 重启(android)

          本文链接:https://www.haomeiwen.com/subject/gxbwmftx.html