5

私のアプリケーションには複数のスレッドがあり、それらが同時にWebサーバーに接続しているため、ThreadSafeClientConnManagerを使用してクライアント接続のプールを管理しています。

抽象サンプルコード:

HttpClient httpClient;
ClientConnectionManager conMgr = new ThreadSafeClientConnManager(parameters,schReg);
httpclient = new DefaultHttpClient(conMgr, parameters);

ここで、このスレッドの1つが大きなファイルをダウンロードしているとしましょう。しかし、私のアプリケーションのユーザーは別のアクティビティ/画面に切り替えています。そのため、ファイルは不要であり、このダウンロード接続を中止したいと思います。

ThreadSafeClientConnManagerで、次のメソッドを見つけました。

public ClientConnectionRequest requestConnection (HttpRoute route, Object state) 新しいClientConnectionRequestを返します。この要求から、ManagedClientConnectionを取得したり、要求を中止したりできます

これまで私が使用してきたもの:

HttpGet httpRequest = new HttpGet(URL_TO_FILE);
HttpResponse response = (HttpResponse) httpclient.execute(httpRequest);
[...]

今私が理解していることから、私は使用する必要があります:

httpclient.getConnectionManager().requestConnection(HttpRoute route, Object state);

そして、それは私が立ち往生しているポイントです。ルートについてはnew HttpRoute(new HttpHost("10.0.0.1"))、サーバーが何であれ、そのまま使用できると思いますが、何を入力すればよいObject stateでしょうか。

そして第二に、ClientConnectionManager私が電話をかけるとすぐにgetConnection(long timeout, TimeUnit tunit)。しかし、そこから、HttpGet httpRequest = new HttpGet(URL_TO_FILE);以前と同じようにどのように実行しHttpResponse response = (HttpResponse) httpclient.execute(httpRequest);ますか?

私はドキュメントを読み、かなりの数の異なることを試しましたが、実用的な解決策を得ることができませんでした。そのため、提案やコード例は大歓迎です。

4

1 に答える 1

5

電話をかけるだけhttpRequest.abort()で、接続を閉じる必要があります。

大きなファイルの場合、データをループ処理する必要があります。キャンセルステータスを確認して、そこから中止するだけです。

    HttpEntity entity = response.getEntity();
    if (entity != null) {
        InputStream instream = entity.getContent();
        while (instream.read(buf) >= 0) {
            if (cancelled)
               httpRequest.abort();
            // Process the file
        }
     }

プールまたはキープアライブが使用されている場合、中止された接続をプールに戻すことはできないため、接続を閉じる必要があります。古いバージョンには、接続が維持され、次のリクエストが台無しになるというバグがありました。これはすべて修正されたと思います。

于 2009-10-14T12:20:32.843 に答える