From c10ef4dc46b75f2eb3327f51cb9efbc351313421 Mon Sep 17 00:00:00 2001 From: sospartan Date: Tue, 7 Mar 2017 15:48:37 +0800 Subject: [PATCH 1/2] * [android] fix ConcurrentModificationException in registeration. --- .../taobao/weex/bridge/WXBridgeManager.java | 53 +++++++++++++------ 1 file changed, 37 insertions(+), 16 deletions(-) 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 cfa043db5e..1fecf3f1c3 100755 --- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java +++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java @@ -1156,18 +1156,35 @@ private WXParams assembleDefaultOptions() { } private void execRegisterFailTask() { - int moduleCount = mRegisterModuleFailList.size(); - if (moduleCount > 0) { - for (int i = 0; i < moduleCount; ++i) { - invokeRegisterModules(mRegisterModuleFailList.get(i)); + + if (mRegisterModuleFailList.size() > 0) { + List> moduleReceiver = new ArrayList<>(); + for (int i = 0, moduleCount = mRegisterModuleFailList.size(); i < moduleCount; ++i) { + invokeRegisterModules(mRegisterModuleFailList.get(i), moduleReceiver); + } + mRegisterComponentFailList.clear(); + if (moduleReceiver.size() > 0) { + mRegisterComponentFailList.addAll(moduleReceiver); } } + if (mRegisterComponentFailList.size() > 0) { - invokeRegisterComponents(mRegisterComponentFailList); + List> receiver = new ArrayList<>(); + invokeRegisterComponents(mRegisterComponentFailList, receiver); + mRegisterComponentFailList.clear(); + if (receiver.size() > 0) { + mRegisterComponentFailList.addAll(receiver); + } } + if (mRegisterServiceFailList.size() > 0) { + List receiver = new ArrayList<>(); for (String service : mRegisterServiceFailList) { - invokeExecJSService(service); + invokeExecJSService(service, receiver); + } + mRegisterServiceFailList.clear(); + if (receiver.size() > 0) { + mRegisterServiceFailList.addAll(receiver); } } } @@ -1181,13 +1198,13 @@ private void execRegisterFailTask() { public void registerModules(final Map modules) { if (modules != null && modules.size() != 0) { if(isJSThread()){ - invokeRegisterModules(modules); + invokeRegisterModules(modules,mRegisterModuleFailList); } else{ post(new Runnable() { @Override public void run() { - invokeRegisterModules(modules); + invokeRegisterModules(modules,mRegisterComponentFailList); } }, null); } @@ -1205,7 +1222,7 @@ public void registerComponents(final List> components) { post(new Runnable() { @Override public void run() { - invokeRegisterComponents(components); + invokeRegisterComponents(components,mRegisterComponentFailList); } }, null); } @@ -1214,16 +1231,16 @@ public void execJSService(final String service) { post(new Runnable() { @Override public void run() { - invokeExecJSService(service); + invokeExecJSService(service,mRegisterServiceFailList); } }); } - private void invokeExecJSService(String service) { + private void invokeExecJSService(String service, List receiver) { try { if (!isJSFrameworkInit()) { WXLogUtils.e("[WXBridgeManager] invoke execJSService: framework.js uninitialized."); - mRegisterServiceFailList.add(service); + receiver.add(service); return; } mWXBridge.execJSService(service); @@ -1237,12 +1254,12 @@ private boolean isJSThread() { return mJSThread != null && mJSThread.getId() == Thread.currentThread().getId(); } - private void invokeRegisterModules(Map modules) { + private void invokeRegisterModules(Map modules, List> failReceiver) { if (modules == null || !isJSFrameworkInit()) { if (!isJSFrameworkInit()) { WXLogUtils.e("[WXBridgeManager] invokeCallJSBatch: framework.js uninitialized."); } - mRegisterModuleFailList.add(modules); + failReceiver.add(modules); return; } @@ -1256,11 +1273,15 @@ private void invokeRegisterModules(Map modules) { } } - private void invokeRegisterComponents(List> components) { + private void invokeRegisterComponents(List> components,List> failReceiver) { + if(components == failReceiver){ + throw new RuntimeException("Fail receiver should not use source."); + } if (!isJSFrameworkInit()) { WXLogUtils.e("[WXBridgeManager] invokeCallJSBatch: framework.js uninitialized."); + for (Map comp:components){ - mRegisterComponentFailList.add(comp); + failReceiver.add(comp); } return; } From 6ac82334e24725e6aa4cee8305b25a0a1f494b9f Mon Sep 17 00:00:00 2001 From: sospartan Date: Wed, 8 Mar 2017 14:21:14 +0800 Subject: [PATCH 2/2] * [android] format code --- .../java/com/taobao/weex/bridge/WXBridgeManager.java | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) 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 1fecf3f1c3..de296ff141 100755 --- a/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java +++ b/android/sdk/src/main/java/com/taobao/weex/bridge/WXBridgeManager.java @@ -1198,13 +1198,13 @@ private void execRegisterFailTask() { public void registerModules(final Map modules) { if (modules != null && modules.size() != 0) { if(isJSThread()){ - invokeRegisterModules(modules,mRegisterModuleFailList); + invokeRegisterModules(modules, mRegisterModuleFailList); } else{ post(new Runnable() { @Override public void run() { - invokeRegisterModules(modules,mRegisterComponentFailList); + invokeRegisterModules(modules, mRegisterComponentFailList); } }, null); } @@ -1222,7 +1222,7 @@ public void registerComponents(final List> components) { post(new Runnable() { @Override public void run() { - invokeRegisterComponents(components,mRegisterComponentFailList); + invokeRegisterComponents(components, mRegisterComponentFailList); } }, null); } @@ -1231,7 +1231,7 @@ public void execJSService(final String service) { post(new Runnable() { @Override public void run() { - invokeExecJSService(service,mRegisterServiceFailList); + invokeExecJSService(service, mRegisterServiceFailList); } }); } @@ -1273,7 +1273,7 @@ private void invokeRegisterModules(Map modules, List> components,List> failReceiver) { + private void invokeRegisterComponents(List> components, List> failReceiver) { if(components == failReceiver){ throw new RuntimeException("Fail receiver should not use source."); }