是否可能有一个与EDT分开的线程,该线程在应用程序启动时启动,并且仅在有Internet连接时才执行一些代码?我的意思是,如果出现连接错误,它不会显示或抛出任何错误或异常,它必须等到与正在运行的服务器的连接时。
我的用例是版本检查:将支持的最低应用程序与当前应用程序版本进行比较。
答案 0 :(得分:1)
您不需要单独的线程来执行此操作。您可以只有一个轮询服务器的计时器。如果没有互联网连接,它可能会静默失败。您可以使用setFailSilently(true)
吞噬该特定URL中的错误。
或者,当将连接请求传递给错误事件回调时,全局处理代码可以从该URL过滤错误。例如。此代码会在应用启动后10秒钟开始检查,因此不会降低启动速度:
UITimer.timer(10000, false, () -> {
Server.checkVersion((currentVersion, oldestSupportedVersion) -> {
float ver = Float.parseFloat(getProperty("AppVersion", "0.1"));
if(ver < oldestSupportedVersion) {
Dialog.show("Error", "This version is out of date!\nPlease update the app from the store!", "Exit", null);
exitApplication();
return;
}
if(currentVersion > ver) {
ToastBar.showInfoMessage("A new version of the app is available...");
}
});
});
public static interface VersionCallback {
public void version(float currentVersion, float oldestSupportedVersion);
}
public static void checkVersion(VersionCallback ver) {
Rest.
get(url-to-properties-file-on-server).
fetchAsBytes(res -> {
if(res.getResponseCode() == 200) {
try {
Properties p = new Properties();
p.load(new ByteArrayInputStream(res.getResponseData()));
String currentVer = p.getProperty("app.current","0.15");
String lastSupported = p.getProperty("app.lastSupported","0.14");
ver.version(Float.parseFloat(currentVer),
Float.parseFloat(lastSupported));
} catch(IOException err) {
Log.e(err);
}
}
});
}