diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogPane.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogPane.java index f8442e25b..eaf3a103e 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogPane.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/construct/TaskExecutorDialogPane.java @@ -40,6 +40,7 @@ import static org.jackhuang.hmcl.util.i18n.I18n.i18n; public class TaskExecutorDialogPane extends BorderPane { private TaskExecutor executor; private TaskCancellationAction onCancel; + @SuppressWarnings({"unused", "FieldCanBeLocal"}) private final Consumer speedEventHandler; private final Label lblTitle; @@ -84,7 +85,7 @@ public class TaskExecutorDialogPane extends BorderPane { } }); - speedEventHandler = speedEvent -> { + speedEventHandler = FetchTask.SPEED_EVENT.registerWeak(speedEvent -> { String unit = "B/s"; double speed = speedEvent.getSpeed(); if (speed > 1024) { @@ -95,11 +96,10 @@ public class TaskExecutorDialogPane extends BorderPane { speed /= 1024; unit = "MiB/s"; } - double finalSpeed = speed; - String finalUnit = unit; - Platform.runLater(() -> lblProgress.setText(String.format("%.1f %s", finalSpeed, finalUnit))); - }; - FileDownloadTask.speedEvent.channel(FetchTask.SpeedEvent.class).registerWeak(speedEventHandler); + + String message = String.format("%.1f %s", speed, unit); + Platform.runLater(() -> lblProgress.setText(message)); + }); onEscPressed(this, btnCancel::fire); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java index 6da4da74e..f39bb4a84 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventBus.java @@ -17,29 +17,32 @@ */ package org.jackhuang.hmcl.event; -import java.util.concurrent.ConcurrentHashMap; +import org.jetbrains.annotations.NotNull; import static org.jackhuang.hmcl.util.logging.Logger.LOG; -/** - * - * @author huangyuhui - */ -public final class EventBus { +/// @author huangyuhui +public final class EventBus extends ClassValue> { - private final ConcurrentHashMap, EventManager> events = new ConcurrentHashMap<>(); + public static final EventBus EVENT_BUS = new EventBus(); + + private EventBus() { + } + + @Override + protected EventManager computeValue(@NotNull Class type) { + return new EventManager<>(); + } @SuppressWarnings("unchecked") public EventManager channel(Class clazz) { - return (EventManager) events.computeIfAbsent(clazz, ignored -> new EventManager<>()); + return (EventManager) get(clazz); } @SuppressWarnings("unchecked") public Event.Result fireEvent(Event obj) { LOG.info(obj + " gets fired"); - return channel((Class) obj.getClass()).fireEvent(obj); + return ((EventManager) get(obj.getClass())).fireEvent(obj); } - - public static final EventBus EVENT_BUS = new EventBus(); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java index 2516e67ff..952b3673e 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/EventManager.java @@ -18,6 +18,7 @@ package org.jackhuang.hmcl.event; import org.jackhuang.hmcl.util.SimpleMultimap; +import org.jetbrains.annotations.Contract; import java.lang.ref.WeakReference; import java.util.EnumMap; @@ -25,21 +26,20 @@ import java.util.concurrent.CopyOnWriteArraySet; import java.util.concurrent.locks.ReentrantLock; import java.util.function.Consumer; -/** - * - * @author huangyuhui - */ +/// @author huangyuhui public final class EventManager { private final ReentrantLock lock = new ReentrantLock(); private final SimpleMultimap, CopyOnWriteArraySet>> handlers = new SimpleMultimap<>(() -> new EnumMap<>(EventPriority.class), CopyOnWriteArraySet::new); + @Contract("_ -> param1") public Consumer registerWeak(Consumer consumer) { register(new WeakListener(consumer)); return consumer; } + @Contract("_, _ -> param1") public Consumer registerWeak(Consumer consumer, EventPriority priority) { register(new WeakListener(consumer), priority); return consumer; diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/FailedEvent.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/event/FailedEvent.java deleted file mode 100644 index 1403ae78e..000000000 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/event/FailedEvent.java +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Hello Minecraft! Launcher - * Copyright (C) 2020 huangyuhui and contributors - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package org.jackhuang.hmcl.event; - -/** - * - * @author huang - */ -public class FailedEvent extends Event { - - private final int failedTime; - private T newResult; - - public FailedEvent(Object source, int failedTime, T newResult) { - super(source); - this.failedTime = failedTime; - this.newResult = newResult; - } - - public int getFailedTime() { - return failedTime; - } - - public T getNewResult() { - return newResult; - } - - public void setNewResult(T newResult) { - this.newResult = newResult; - } - -} diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java index 9c7cd9f6d..47f0364ea 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/FetchTask.java @@ -19,6 +19,7 @@ package org.jackhuang.hmcl.task; import org.jackhuang.hmcl.event.Event; import org.jackhuang.hmcl.event.EventBus; +import org.jackhuang.hmcl.event.EventManager; import org.jackhuang.hmcl.util.*; import org.jackhuang.hmcl.util.io.ContentEncoding; import org.jackhuang.hmcl.util.io.IOUtils; @@ -355,13 +356,13 @@ public abstract class FetchTask extends Task { private static final Timer timer = new Timer("DownloadSpeedRecorder", true); private static final AtomicLong downloadSpeed = new AtomicLong(0L); - public static final EventBus speedEvent = new EventBus(); + public static final EventManager SPEED_EVENT = EventBus.EVENT_BUS.channel(SpeedEvent.class); static { timer.schedule(new TimerTask() { @Override public void run() { - speedEvent.channel(SpeedEvent.class).fireEvent(new SpeedEvent(speedEvent, downloadSpeed.getAndSet(0))); + SPEED_EVENT.fireEvent(new SpeedEvent(SPEED_EVENT, downloadSpeed.getAndSet(0))); } }, 0, 1000); }