2

トリガーされたときに接続を閉じるタイマー タスクがあります。問題は、次のように、接続が実際に開く前にトリガーされることがあるということです。

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)line: 484 and a source not found :S.

4

1 に答える 1

2

接続は別のスレッドにあり、独自のライフサイクルがあります。タイマー スレッドから同期的にアクセスしようとしています。

まず、接続はステート マシンです。「セットアップ」状態で開始し、いくつかのメソッド (サーバーに接続する必要があるメソッド) が呼び出されると「接続済み」状態に変わり、最後に接続が確立されると「閉じた」状態に変わります。サーバーまたはクライアントのいずれかによって終了します。このメソッドgetResponseCodeは、接続がまだ接続されていない場合に、接続をいわゆる「セットアップ」状態から「接続済み」状態に遷移させることができるメソッドの 1 つです。接続が確立されたかどうかさえわからないまま、すぐに応答コードを取得しようとしています。接続時間を適切に接続または閉じることさえできません。closeできたとしても、javadocs がメソッドについて何を言っているかを見てください。

接続が閉じられている場合、この close() 以外のメソッドにアクセスすると、IOException がスローされます。

閉じた後に本当に何かをする必要がある場合は、「リスナー」オブジェクトを接続に渡して、接続が閉じられたときにコールバックできるようにし、応答コードを返します (サーバーとの接続が以前に行われた場合)。確立された)。

于 2013-03-05T17:14:39.327 に答える