2013-03-05 94 views
2

我有一個關閉時,它的觸發連接的計時器任務,問題是,有時連接實際上是打開之前被觸發,這樣的:關閉黑莓的HttpConnection上超時

try { 
    HttpConnection conn = getMyConnection(); // Asume this returns a valid connection object 

    // ... At this moment the timer triggers the worker wich closes the connection: 
    conn.close(); // This is done by the timeTask before conn.getResponseCode() 

    int mCode = conn.getResponseCode(); // BOOOMMMM!!!! EXPLOTION!!!! 

    // ... Rest of my code here. 

} catch(Throwable e) { 
    System.out.println("ups..."); // This never gets called... Why? 
} 

當我嘗試conn.getResponseCode(),拋出一個異常,但不是這樣,爲什麼?

我得到這個錯誤:ClientProtocol(HttpProtocolBase).transitionToState(int)行:484和未找到源:S。

+1

下面的帖子很好地解釋了這種情況,建議嘗試在關閉連接之前獲取responseCode或讀取輸入流。 – 2013-03-05 18:19:38

回答

2

連接生活在不同的線程中,並有其自己的生命週期。您正嘗試以同步方式從計時器線程訪問它。

首先,連接是一個狀態機。它在「setup」狀態下啓動,如果調用某些方法(任何需要聯繫服務器的方法),則會切換到「connected」狀態,最後當連接已經變爲「closed」狀態時由服務器或客戶端終止。方法getResponseCode是那些可能導致連接從所謂的「設置」狀態轉換到「連接」狀態(如果它尚未連接)的方法之一。您正試圖立即獲取響應代碼,而無需知道連接是否已建立。您甚至不會讓連接時間正確連接或關閉。即使你可以,看看什麼樣的javadoc說的close方法:

When a connection has been closed, access to any of its methods except this close() will cause an an IOException to be thrown.

如果你真的需要它已被關閉後做一些事情,通過一個「監聽器」對象的連接,以便它可以在連接關閉後回撥,並返回響應代碼(如果與服務器的連接已建立)。