From a9261b759bf5d7f9afcf1796b9436d08693ee40f Mon Sep 17 00:00:00 2001 From: huangyuhui Date: Wed, 6 Jun 2018 23:52:23 +0800 Subject: [PATCH] Shutdown Now to prevent NPE when task executed after app closed --- .../java/org/jackhuang/hmcl/ui/Controllers.java | 2 ++ .../org/jackhuang/hmcl/upgrade/UpdateChecker.java | 13 ++++++++++++- .../jackhuang/hmcl/game/DefaultGameRepository.java | 6 ++++++ .../java/org/jackhuang/hmcl/task/Schedulers.java | 6 +++--- .../java/org/jackhuang/hmcl/task/TaskExecutor.java | 4 +++- 5 files changed, 26 insertions(+), 5 deletions(-) diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java index aa55d198b..5521399a4 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/ui/Controllers.java @@ -171,6 +171,8 @@ public final class Controllers { } public static void showUpdate() { + if (stage == null) // shut down + return; getLeftPaneController().showUpdate(); } diff --git a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java index 9dcd9eed9..5c39949a7 100644 --- a/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java +++ b/HMCL/src/main/java/org/jackhuang/hmcl/upgrade/UpdateChecker.java @@ -22,6 +22,8 @@ import org.jackhuang.hmcl.Launcher; import org.jackhuang.hmcl.event.Event; import org.jackhuang.hmcl.event.EventBus; import org.jackhuang.hmcl.event.OutOfDateEvent; +import org.jackhuang.hmcl.task.GetTask; +import org.jackhuang.hmcl.task.Task; import org.jackhuang.hmcl.task.TaskResult; import org.jackhuang.hmcl.ui.construct.MessageBox; import org.jackhuang.hmcl.util.Constants; @@ -30,6 +32,8 @@ import org.jackhuang.hmcl.util.NetworkUtils; import org.jackhuang.hmcl.util.VersionNumber; import java.io.IOException; +import java.util.Collection; +import java.util.Collections; import java.util.Map; import java.util.logging.Level; @@ -65,13 +69,20 @@ public final class UpdateChecker { */ public TaskResult process(final boolean showMessage) { return new TaskResult() { + GetTask http = new GetTask(NetworkUtils.toURL("https://huangyuhui.duapp.com/hmcl/update.php?version=" + Launcher.VERSION)); + + @Override + public Collection getDependents() { + return value == null ? Collections.singleton(http) : Collections.emptyList(); + } + @Override public void execute() throws Exception { if (Launcher.VERSION.contains("@")) return; if (value == null) { - versionString = NetworkUtils.doGet(NetworkUtils.toURL("https://huangyuhui.duapp.com/hmcl/update.php?version=" + Launcher.VERSION)); + versionString = http.getResult(); value = VersionNumber.asVersion(versionString); } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java index 9278516a6..736765cd2 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/game/DefaultGameRepository.java @@ -172,6 +172,12 @@ public class DefaultGameRepository implements GameRepository { if (files != null) for (File dir : files) if (dir.isDirectory()) { + if (Thread.interrupted()) { + this.versions = new HashMap<>(); + loaded = false; + return; + } + String id = dir.getName(); File json = new File(dir, id + ".json"); diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java index d6ed22131..8a1d53b00 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/Schedulers.java @@ -119,12 +119,12 @@ public final class Schedulers { Logging.LOG.info("Shutting down executor services."); if (CACHED_EXECUTOR != null) - CACHED_EXECUTOR.shutdown(); + CACHED_EXECUTOR.shutdownNow(); if (IO_EXECUTOR != null) - IO_EXECUTOR.shutdown(); + IO_EXECUTOR.shutdownNow(); if (SINGLE_EXECUTOR != null) - SINGLE_EXECUTOR.shutdown(); + SINGLE_EXECUTOR.shutdownNow(); } } diff --git a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java index f3a0ace83..68fd5f671 100644 --- a/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java +++ b/HMCLCore/src/main/java/org/jackhuang/hmcl/task/TaskExecutor.java @@ -89,8 +89,10 @@ public final class TaskExecutor { while (!workerQueue.isEmpty()) { Future future = workerQueue.poll(); - if (future != null) + if (future != null) { future.cancel(true); + System.out.println("Canceled " + future); + } } }