Replace Properties with InvocationDispatcher & Make config saving async

This commit is contained in:
yushijinhun
2018-09-22 14:04:05 +08:00
parent fa38c53915
commit 4a0831a155
6 changed files with 77 additions and 86 deletions

View File

@@ -80,9 +80,6 @@ public final class Launcher extends Application {
try {
Logging.start(LOG_DIRECTORY);
// NetworkUtils.setUserAgentSupplier(() -> "Hello Minecraft! Launcher");
Constants.UI_THREAD_SCHEDULER = Constants.JAVAFX_UI_THREAD_SCHEDULER;
LOG.info("*** " + Metadata.TITLE + " ***");
LOG.info("Operating System: " + System.getProperty("os.name") + ' ' + OperatingSystem.SYSTEM_VERSION);
LOG.info("Java Version: " + System.getProperty("java.version") + ", " + System.getProperty("java.vendor"));

View File

@@ -27,9 +27,11 @@ import java.nio.file.Paths;
import java.util.Map;
import java.util.logging.Level;
import org.jackhuang.hmcl.util.InvocationDispatcher;
import org.jackhuang.hmcl.util.platform.OperatingSystem;
import static java.nio.charset.StandardCharsets.UTF_8;
import static org.jackhuang.hmcl.util.Lang.thread;
import static org.jackhuang.hmcl.util.Logging.LOG;
public final class ConfigHolder {
@@ -43,6 +45,19 @@ public final class ConfigHolder {
private static Config configInstance;
private static boolean newlyCreated;
private static InvocationDispatcher<String> configWriter = new InvocationDispatcher<>(content -> {
thread(() -> {
LOG.info("Saving config");
try {
synchronized (configLocation) {
Files.write(configLocation, content.get().getBytes(UTF_8));
}
} catch (IOException e) {
LOG.log(Level.SEVERE, "Failed to save config", e);
}
});
});
public static Config config() {
if (configInstance == null) {
throw new IllegalStateException("Configuration hasn't been loaded");
@@ -69,7 +84,7 @@ public final class ConfigHolder {
Settings.init();
if (newlyCreated) {
saveConfig();
markConfigDirty();
// hide the config file on windows
if (OperatingSystem.CURRENT_OS == OperatingSystem.WINDOWS) {
@@ -123,22 +138,7 @@ public final class ConfigHolder {
return new Config();
}
private static void saveConfig() throws IOException {
LOG.info("Saving config");
try {
Files.write(configLocation, configInstance.toJson().getBytes(UTF_8));
} catch (IOException e) {
LOG.log(Level.SEVERE, "Failed to save config", e);
throw e;
}
}
static void markConfigDirty() {
// TODO: change this to async
try {
saveConfig();
} catch (IOException ignored) {
// ignore it as it has been logged
}
configWriter.accept(configInstance.toJson());
}
}