代号一-仅在Internet连接可用时才执行代码

时间:2019-01-01 01:15:19

标签: codenameone

是否可能有一个与EDT分开的线程,该线程在应用程序启动时启动,并且仅在有Internet连接时才执行一些代码?我的意思是,如果出现连接错误,它不会显示或抛出任何错误或异常,它必须等到与正在运行的服务器的连接时。

我的用例是版本检查:将支持的最低应用程序与当前应用程序版本进行比较。

1 个答案:

答案 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);
                }
            }
        });
}