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();
}
我还覆盖了 handleIoException
和 handleException
方法,所以我没有显示通用对话框,而是用消息填充响应对象,该消息显示在 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 基本设计的核心。
我没有看到一种通用的方法来使它以不同的方式工作。解决方法是使用 NetworkManager
的 addErrorListener()
而不是覆盖这些方法。
我遇到连接错误时应用程序的行为方式问题。
当用户填写 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();
}
我还覆盖了 handleIoException
和 handleException
方法,所以我没有显示通用对话框,而是用消息填充响应对象,该消息显示在 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 基本设计的核心。
我没有看到一种通用的方法来使它以不同的方式工作。解决方法是使用 NetworkManager
的 addErrorListener()
而不是覆盖这些方法。