2015-12-21 46 views
1

我遇到了連接錯誤時應用程序行爲方式的問題。Codename One中的連接錯誤時的錯誤行爲ConnectionRequest

當用戶填寫用戶名/密碼的字段我做了以下內容:

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

在Web服務調用者,我有:

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中。

發生錯誤的事情是上述方法的返回部分在錯誤管理方法完成之前調用。

所以基本上它應該是call->wait->errorManagementcomplete->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」); 
} 

回答

0

錯誤處理先到達NetworkManager誤差聽衆,然後才調用句柄方法(例如handleException)。

這很重要,因爲您可能想全局地處理錯誤,例如,如果你有這樣的代碼:

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

在這段代碼中,你將有效地阻止代號一個處理一個通用的方式所有的錯誤,並因爲它們顯示錯誤對話框這必須發生手柄*方法被調用之前。

addToQueueAndWait方法通過偵聽網絡/錯誤事件來阻止。在正常完成時,這可以很好地工作,但是對於錯誤事件,您將在調用句柄方法之前獲得錯誤偵聽器回調。由於通用addToQueueAndWait方法不能覆蓋方法,並且如果定義了不希望顯示錯誤的情況下仍應該正常工作,這是該API的基本設計的核心內容。

我沒有看到一種通用的方式來使其工作方式不同。解決方法是使用NetworkManageraddErrorListener()而不是重寫這些方法。