Codenameone 区分服务器端错误和连接问题

Codenameone 区分服务器端错误和连接问题,codenameone,Codenameone,如代码名“一篇博文”所述: 更好的错误代码处理 直到最近,如果我们收到一个错误响应代码,它还没有被发送 通过全局错误处理程序,并通过本地错误处理程序进行处理 先处理链条。这种情况已不再存在,这些错误正在发生 现在处理正确了 然而,如果你依赖旧版本的错误行为 setHandleErrorCodesInGlobalErrorHandler(布尔值)。这默认为 如果为true,则可以将其设置为false以更改默认行为 因此,服务器端错误和连接问题都会调用全局错误处理程序。能够以最通用的方式管理网络错误

如代码名“一篇博文”所述:

更好的错误代码处理

直到最近,如果我们收到一个错误响应代码,它还没有被发送 通过全局错误处理程序,并通过本地错误处理程序进行处理 先处理链条。这种情况已不再存在,这些错误正在发生 现在处理正确了

然而,如果你依赖旧版本的错误行为
setHandleErrorCodesInGlobalErrorHandler(布尔值)
。这默认为 如果为true,则可以将其设置为false以更改默认行为

因此,服务器端错误和连接问题都会调用全局错误处理程序。能够以最通用的方式管理网络错误是一件非常好的事情,但是我需要区分服务器端错误和连接问题

经过一些测试,我编写了以下代码,在模拟器、Android和iOS上进行了测试:

addNetworkErrorListener(err -> {
            // prevents the event from propagating
            err.consume();

            if (err.getError() != null) {
                // this is the case of a network error,
                // like: java.io.IOException: Unreachable
                Log.p("Error connectiong to: " + err.getConnectionRequest().getUrl());
                // maybe there are connectivity issues, let's try again
                ToastBar.showInfoMessage("Trying to reconnect...");
                Timer timer = new Timer();
                timer.schedule(new TimerTask() {
                    @Override
                    public void run() {
                        err.getConnectionRequest().retry();
                    }
                }, 2000);
            } else {
                // this is the case of a server error
                // logs the error
                Log.p("REST ERROR\nURL:" + err.getConnectionRequest().getUrl()
                        + "\nMethod: " + err.getConnectionRequest().getHttpMethod()
                        + "\nRequest body: " + err.getConnectionRequest().getRequestBody()
                        + "\nResponse code: " + err.getConnectionRequest().getResponseCode()
                        + "\nResponse message: " + StringUtilities.toString(err.getConnectionRequest().getResponseData()),
                        Log.ERROR);

                Log.sendLogAsync();
                ToastBar.showErrorMessage("Server Error", 10000);
            }
        });
在测试的平台中,报告了服务器端错误,但随后没有进一步的操作;通过每两秒钟重试一次连接来报告和管理连接错误

因此,该代码是有效的

无论如何,我不喜欢的是假设
err.getError()!=null
对于连接错误为true,对于服务器端错误为false。经过几次测试,我得出了这个假设,但我在任何地方都没有找到记录

因此,我的问题是:

  • 我的假设总是正确的
  • 有一种更好的方法可以区分服务器端错误和连接错误

  • 谢谢

    也许我们应该有一个子类NetworkEvent来表示连接问题。现在我还不知道有更好的方法,也许我们应该有一个子类NetworkEvent来表示连接问题。现在我还不知道有更好的方法