Codename One ConnectionRequest 中出现连接错误时的不正确行为

Incorrect behavior in case of connection error in Codename One ConnectionRequest

我遇到连接错误时应用程序的行为方式问题。

当用户填写 user/pass 字段时,我执行以下操作:

  public static AuthenticationResponse authenticate (String username, String password){    
    return WebServiceCaller.authenticate(username, password, ServiceDefinitions.getAuthenticationServiceDefintion());
  }

在网络服务调用者中我有:

public static AuthenticationResponse authenticate(String username, String password, ServiceDefinition definition) {
    AuthenticationService authenticationService = new AuthenticationService(username, password);
    NetworkManager.getInstance().setTimeout(10000); // change the default timeout of network.
    service.setTimeout(10000); // change the default timeout of request connection
    service.setUrl(definition.getUrl());
    service.setContentType(definition.getContentType());
    service.setPost(definition.isPost());
    InfiniteProgress ip = new InfiniteProgress();
    Dialog dlg = ip.showInifiniteBlocking();
    service.setDisposeOnCompletion(dlg);
    NetworkManager.getInstance().addToQueueAndWait(authenticationService);    
    return authenticationService.getModelResponse();
}

我还覆盖了 handleIoExceptionhandleException 方法,所以我没有显示通用对话框,而是用消息填充响应对象,该消息显示在 GUI 中。

不正确的是,在错误管理方法完成之前调用了上述方法的 return 部分。

所以基本上应该是 call->wait->errorManagement complete->return 但我得到的是 call->wait->errorManagement->return->errorManagemetnComplete.

也许我在网络管理器的工作方式上遗漏了一些东西,它是多线程操作,如果你有更详细的文档,我很乐意阅读。

我在覆盖方法中所做的如下所示:

/** Handles IOException thrown when performing a network operation */
@Override
protected void handleIOException(IOException err) {
    Log.p("Handle IOException, when network is down! ");               
    manageGenericErrors();
}   

@Override
public void manageGenericErrors() {
    response.setIsSuccessful(false);
    response.setResponseMessage("Service not available”);
}

错误处理首先进入 NetworkManager 错误侦听器,然后才调用处理方法(例如 handleException)。

这很重要,因为您可能希望在全局范围内以不同方式处理错误,例如如果您有这样的代码:

NetworkManager.getInstance().addErrorListener((e) -> e.consume());

在此代码中,您将以通用方式有效地阻止代号一中的所有错误处理,并且这必须在调用 handle* 方法之前发生,因为它们会显示错误对话框。

addToQueueAndWait 方法通过监听 network/error 事件来阻止。在正常完成时,这工作得很好,但在发生错误事件时,您会在调用 handle 方法之前获得错误侦听器回调。由于通用 addToQueueAndWait 方法不能重写方法,并且如果您定义了不希望显示错误,它应该仍然可以正常工作,这是 API 基本设计的核心。

我没有看到一种通用的方法来使它以不同的方式工作。解决方法是使用 NetworkManageraddErrorListener() 而不是覆盖这些方法。