Browse Source

REPORT-66930 【组件商城风格优化】网慢时多次点击下载出现多个弹窗

【问题原因】
存在任务重复创建和执行的问题

【改动思路】
同上
bugfix/11.0
Starryi 3 years ago
parent
commit
dcc0f0ad2a
  1. 73
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java
  2. 6
      designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java

73
designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeProductBridge.java

@ -37,10 +37,15 @@ import java.util.Set;
* Created by Starryi on 2021/12/20
*/
public class NativeProductBridge {
private static final Map<String, ComponentInstallationTask> createdComponentInstallationTasks = new HashMap<>();
private static final Map<String, ComponentsPackageInstallationTask> createdComponentsPackageInstallationTasks = new HashMap<>();
private static final Map<String, TemplateThemeInstallationTask> createdTemplateThemeInstallationTasks = new HashMap<>();
private static final Map<String, ComponentInstallationTask> startedComponentInstallationTasks = new HashMap<>();
private static final Map<String, ComponentsPackageInstallationTask> startedComponentsPackageInstallationTasks = new HashMap<>();
private static final Map<String, TemplateThemeInstallationTask> startedTemplateThemeInstallationTasks = new HashMap<>();
private final Object window;
private static final Map<String, ComponentInstallationTask> executingComponentInstallationTasks = new HashMap<>();
private static final Map<String, ComponentsPackageInstallationTask> executingComponentsPackageInstallationTasks = new HashMap<>();
private static final Map<String, TemplateThemeInstallationTask> executingTemplateThemeInstallationTasks = new HashMap<>();
private final Map<String, Set<Object>> componentDownloadTaskStartListeners = new HashMap<>();
private final Map<String, Set<Object>> componentsPackageDownloadTaskStartListeners = new HashMap<>();
@ -115,7 +120,7 @@ public class NativeProductBridge {
boolean isPackage = widget.isWidgetPackage();
Map<String, ? extends NativeTaskBridge> executingDownloadTask =
isPackage ? executingComponentsPackageInstallationTasks : executingComponentInstallationTasks;
isPackage ? startedComponentsPackageInstallationTasks : startedComponentInstallationTasks;
NativeTaskBridge task = executingDownloadTask.get(uuid);
if (task != null) {
task.checkJSEnvChange(this.window);
@ -131,9 +136,22 @@ public class NativeProductBridge {
OnlineShareWidget widget = OnlineShareWidget.parseFromJSONObject(object);
int childrenCount = object.optInt("pkgsize", 0);
if (childrenCount > 0) {
return new ComponentsPackageInstallationTask(this, window, widget, childrenCount);
if (createdComponentsPackageInstallationTasks.containsKey(widget.getUuid())) {
return createdComponentsPackageInstallationTasks.get(widget.getUuid());
} else {
ComponentsPackageInstallationTask task = new ComponentsPackageInstallationTask(this, window, widget, childrenCount);
createdComponentsPackageInstallationTasks.put(widget.getUuid(), task);
return task;
}
} else {
return new ComponentInstallationTask(this, window, widget);
if (createdComponentInstallationTasks.containsKey(widget.getUuid())) {
return createdComponentInstallationTasks.get(widget.getUuid());
} else {
ComponentInstallationTask task = new ComponentInstallationTask(this, window, widget);
createdComponentInstallationTasks.put(widget.getUuid(), task);
return task;
}
}
}
@ -165,7 +183,7 @@ public class NativeProductBridge {
@JsAccessible
@JSBridge
public Object getExecutingThemeDownloadTask(String themePath) {
NativeTaskBridge task = (NativeTaskBridge) executingTemplateThemeInstallationTasks.get(themePath);
NativeTaskBridge task = startedTemplateThemeInstallationTasks.get(themePath);
if (task != null) {
task.checkJSEnvChange(this.window);
}
@ -176,7 +194,13 @@ public class NativeProductBridge {
@JsAccessible
@JSBridge
public Object createTemplateThemeDownloadTask(String themePath) {
return new TemplateThemeInstallationTask(this, window, themePath);
if (createdTemplateThemeInstallationTasks.containsKey(themePath)) {
return createdTemplateThemeInstallationTasks.get(themePath);
} else {
TemplateThemeInstallationTask task = new TemplateThemeInstallationTask(this, window, themePath);
createdTemplateThemeInstallationTasks.put(themePath, task);
return task;
}
}
public static class ComponentInstallationTask extends NativeTaskBridge {
@ -217,6 +241,9 @@ public class NativeProductBridge {
@JSBridge
@Override
public void execute() {
if (isExecuting) {
return;
}
super.execute();
SwingUtilities.invokeLater(new Runnable() {
@Override
@ -257,7 +284,7 @@ public class NativeProductBridge {
@Override
protected void fireStartEvent(String event) {
executingComponentInstallationTasks.put(widget.getUuid(), this);
startedComponentInstallationTasks.put(widget.getUuid(), this);
Set<Object> startListeners = env.componentDownloadTaskStartListeners.get(widget.getUuid());
SafeJSFunctionInvoker.invoke(startListeners, env.window);
super.fireStartEvent(event);
@ -265,13 +292,15 @@ public class NativeProductBridge {
@Override
protected void fireFailureEvent(String event) {
executingComponentInstallationTasks.remove(widget.getUuid());
startedComponentInstallationTasks.remove(widget.getUuid());
createdComponentInstallationTasks.remove(widget.getUuid());
super.fireFailureEvent(event);
}
@Override
protected void fireSuccessEvent(String event) {
executingComponentInstallationTasks.remove(widget.getUuid());
startedComponentInstallationTasks.remove(widget.getUuid());
createdComponentInstallationTasks.remove(widget.getUuid());
super.fireSuccessEvent(event);
}
}
@ -317,6 +346,9 @@ public class NativeProductBridge {
@JSBridge
@Override
public void execute() {
if (isExecuting) {
return;
}
super.execute();
SwingUtilities.invokeLater(new Runnable() {
@Override
@ -373,7 +405,7 @@ public class NativeProductBridge {
@Override
protected void fireStartEvent(String event) {
executingComponentsPackageInstallationTasks.put(widget.getUuid(), this);
startedComponentsPackageInstallationTasks.put(widget.getUuid(), this);
super.fireStartEvent(event);
Set<Object> startListeners = env.componentsPackageDownloadTaskStartListeners.get(widget.getUuid());
@ -382,13 +414,15 @@ public class NativeProductBridge {
@Override
protected void fireFailureEvent(String event) {
executingComponentsPackageInstallationTasks.remove(widget.getUuid());
startedComponentsPackageInstallationTasks.remove(widget.getUuid());
createdComponentsPackageInstallationTasks.remove(widget.getUuid());
super.fireFailureEvent(event);
}
@Override
protected void fireSuccessEvent(String event) {
executingComponentsPackageInstallationTasks.remove(widget.getUuid());
startedComponentsPackageInstallationTasks.remove(widget.getUuid());
createdComponentsPackageInstallationTasks.remove(widget.getUuid());
super.fireSuccessEvent(event);
}
}
@ -426,6 +460,9 @@ public class NativeProductBridge {
@JSBridge
@Override
public void execute() {
if (isExecuting) {
return;
}
super.execute();
SwingUtilities.invokeLater(new Runnable() {
@Override
@ -452,7 +489,7 @@ public class NativeProductBridge {
@Override
protected void fireStartEvent(String event) {
executingTemplateThemeInstallationTasks.put(themePath, this);
startedTemplateThemeInstallationTasks.put(themePath, this);
Set<Object> startListeners = env.themeDownloadTaskStartListeners.get(themePath);
SafeJSFunctionInvoker.invoke(startListeners, env.window);
super.fireStartEvent(event);
@ -460,13 +497,15 @@ public class NativeProductBridge {
@Override
protected void fireFailureEvent(String event) {
executingTemplateThemeInstallationTasks.remove(themePath);
startedTemplateThemeInstallationTasks.remove(themePath);
createdTemplateThemeInstallationTasks.remove(themePath);
super.fireFailureEvent(event);
}
@Override
protected void fireSuccessEvent(String event) {
executingTemplateThemeInstallationTasks.remove(themePath);
startedTemplateThemeInstallationTasks.remove(themePath);
createdTemplateThemeInstallationTasks.remove(themePath);
super.fireSuccessEvent(event);
}
}

6
designer-form/src/main/java/com/fr/design/mainframe/share/ui/online/mini/bridge/NativeTaskBridge.java

@ -18,6 +18,7 @@ public class NativeTaskBridge implements MiniShopNativeTask {
private Object window;
protected final Set<Object> statusCbs = new HashSet<>();
protected boolean isExecuting = false;
public NativeTaskBridge(Object window) {
this.window = window;
@ -49,6 +50,9 @@ public class NativeTaskBridge implements MiniShopNativeTask {
@JsAccessible
@Override
public void execute() {
if (!isExecuting) {
isExecuting = true;
}
}
@JSBridge
@ -68,10 +72,12 @@ public class NativeTaskBridge implements MiniShopNativeTask {
SafeJSFunctionInvoker.invoke(statusCbs, window, "PROGRESS", event);
}
protected void fireSuccessEvent(String event) {
isExecuting = false;
MiniShopNativeTaskManager.getInstance().removeCompletedTask(this);
SafeJSFunctionInvoker.invoke(statusCbs, window, "SUCCESS", event);
}
protected void fireFailureEvent(String event) {
isExecuting = false;
MiniShopNativeTaskManager.getInstance().removeCompletedTask(this);
SafeJSFunctionInvoker.invoke(statusCbs, window, "FAILURE", event);
}

Loading…
Cancel
Save