Repository: incubator-weex Updated Branches: refs/heads/master 28d047512 -> b0704cd11
[WEEX-134][android] createInstance and initFramework may on different Thread, add volatile static for mInit Project: http://git-wip-us.apache.org/repos/asf/incubator-weex/repo Commit: http://git-wip-us.apache.org/repos/asf/incubator-weex/commit/713c6193 Tree: http://git-wip-us.apache.org/repos/asf/incubator-weex/tree/713c6193 Diff: http://git-wip-us.apache.org/repos/asf/incubator-weex/diff/713c6193 Branch: refs/heads/master Commit: 713c6193a0a72beddf1800444dfa4c95d4c2dfdd Parents: d1af84c Author: yuhun-alibaba <tomcat...@gmail.com> Authored: Fri Nov 17 00:16:02 2017 +0800 Committer: yuhun-alibaba <tomcat...@gmail.com> Committed: Mon Nov 20 10:21:46 2017 +0800 ---------------------------------------------------------------------- .../com/taobao/weex/bridge/WXBridgeManager.java | 34 ++++++++++++-------- 1 file changed, 21 insertions(+), 13 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/incubator-weex/blob/713c6193/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java ---------------------------------------------------------------------- diff --git a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java index b6db683..52187ee 100644 --- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java +++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java @@ -137,9 +137,14 @@ public class WXBridgeManager implements Callback, BactchExecutor { private static final int CRASHREINIT = 50; static volatile WXBridgeManager mBridgeManager; private static long LOW_MEM_VALUE = 120; - private static int reInitCount = 1; + private volatile static int reInitCount = 1; private static String crashUrl = null; private static long lastCrashTime = 0; + + /** + * Whether JS Framework(main.js) has been initialized. + */ + private volatile static boolean mInit = false; /** * package **/ @@ -156,10 +161,7 @@ public class WXBridgeManager implements Callback, BactchExecutor { private IWXDebugProxy mWxDebugProxy; private boolean mMock = false; - /** - * Whether JS Framework(main.js) has been initialized. - */ - private boolean mInit = false; + private List<Map<String, Object>> mRegisterComponentFailList = new ArrayList<>(8); private List<Map<String, Object>> mRegisterModuleFailList = new ArrayList<>(8); private List<String> mRegisterServiceFailList = new ArrayList<>(8); @@ -185,8 +187,14 @@ public class WXBridgeManager implements Callback, BactchExecutor { return mBridgeManager; } + // setJSFrameworkInit and isJSFrameworkInit may use on diff thread + // use volatile private boolean isJSFrameworkInit() { - return mInit; + return mInit; + } + + private void setJSFrameworkInit(boolean init) { + mInit = init; } private void initWXBridge(boolean remoteDebug) { @@ -269,7 +277,7 @@ public class WXBridgeManager implements Callback, BactchExecutor { * Model switch. For now, debug model and release model are supported */ public void restart() { - mInit = false; + setJSFrameworkInit(false); initWXBridge(WXEnvironment.sRemoteDebugMode); } @@ -949,7 +957,7 @@ public class WXBridgeManager implements Callback, BactchExecutor { } reInitCount++; // reinit frame work - mInit = false; + setJSFrameworkInit(false); initScriptsFramework(""); if (mDestroyedInstanceId != null && mDestroyedInstanceId.contains(instanceId)) { @@ -1387,8 +1395,8 @@ public class WXBridgeManager implements Callback, BactchExecutor { final long totalTime = System.currentTimeMillis() - start; WXSDKManager.getInstance().postOnUiThread(new Runnable() { - @Override - public void run() { + @Override + public void run() { instance.createInstanceFinished(totalTime); } }, 0); @@ -1560,7 +1568,7 @@ public class WXBridgeManager implements Callback, BactchExecutor { framework = WXFileUtils.loadAsset("main.js", WXEnvironment.getApplication()); } if (TextUtils.isEmpty(framework)) { - mInit = false; + setJSFrameworkInit(false); commitJSFrameworkAlarmMonitor(IWXUserTrackAdapter.JS_FRAMEWORK, WXErrorCode.WX_ERR_JS_FRAMEWORK, "JS Framework is empty!"); return; } @@ -1591,7 +1599,7 @@ public class WXBridgeManager implements Callback, BactchExecutor { WXLogUtils.renderPerformanceLog("initFramework", WXEnvironment.sJSLibInitTime); WXEnvironment.sSDKInitTime = System.currentTimeMillis() - WXEnvironment.sSDKInitStart; WXLogUtils.renderPerformanceLog("SDKInitTime", WXEnvironment.sSDKInitTime); - mInit = true; + setJSFrameworkInit(true); if (WXSDKManager.getInstance().getWXStatisticsListener() != null) { WXSDKManager.getInstance().getWXStatisticsListener().onJsFrameworkReady(); @@ -1870,7 +1878,7 @@ public class WXBridgeManager implements Callback, BactchExecutor { if (METHOD_CREATE_INSTANCE.equals(function)) { try { - if (mInit && reInitCount > 1 && !instance.isNeedReLoad()) { + if (isJSFrameworkInit() && reInitCount > 1 && !instance.isNeedReLoad()) { // JSONObject domObject = JSON.parseObject(tasks); WXDomModule domModule = getDomModule(instanceId); Action action = Actions.getReloadPage(instanceId, true);