8

私のアプリケーションでは、AsyncTaskでHttpURLConnectionを使用してファイルをダウンロードします。ファイルのダウンロードに時間がかかりすぎる場合は、キャンセルします。これを行うには、ストリームを閉じて、オブジェクトでdisconnect()を呼び出します。このコードは、Android で何年も問題なく動作しています。ただし、キットカットがリリースされた今、問題が発生しています。具体的には、呼び出し自体が完了するまでに数秒以上かかります。キットカット以前のデバイスでは、ミリ秒以下でした。本当に奇妙なのは、別のスレッドで切断呼び出しを実行すると、再び非常に高速になることです。したがって、のメソッドでそれを呼び出すと問題になるはずです。注意すべきことの1つは、私にはHttpURLConnectiondisconnect()AsyncTaskdoInBackgroundAsyncTaskLooper.prepare()電話。

KitKat と他の Android バージョンの違いを知っている人はいますか? 変更リストをくまなく調べましたが、この問題に関連するものは何も見つかりませんでした。

4

3 に答える 3

0

これは、永続的な接続と、同じ HTTP 接続を再利用しようとする HttpURLConnection の試みに関連している可能性があります。したがって、接続または InputStream を閉じるときに、残りのデータを読み取って破棄することで、残りのデータをすべて消費しようとします。その後、同じ HTTP 接続が次のコマンドの準備が整います。

KitKat には、状況を変えて問題を引き起こす新しい実装があるようです。

私はHTTP経由でビデオデータをストリーミングしようとしていますが、接続を閉じて新しい接続を開始する結果を時折シークします。確かに、この場合、最後までビデオ ストリームを取得する必要はありません。

電話してみた

HttpURLConnection con;
con.setRequestProperty("Connection", "close");

しかし、違いはありませんでした。

ただし、DefaultHttpClientで同じコードを使用して呼び出してみました

HttpGet get = new HttpGet(uri);
get.addHeader("Connection", "close");

最後に、接続の InputStream を閉じるのは高速です。デバッガーで ConnectionReuseStrategy.keepAlive にステップインし、サーバーが Connection:close を返し、DefaultHttpClient が接続を再利用して最後まで読み取ろうとしなかったことを確認して証明しました。

したがって、DefaultHttpClient を使用するか、HttpURLConnection を作成して残りを読み取らずに接続を閉じる方法を見つけることができます。

于 2014-03-19T09:48:45.807 に答える
0

Kitkat は、以前の HTTPConnection 実装の代わりに okhttp を使用しているようです。または、少なくともこれは、公式のアップデートを適用した Nexus デバイスの場合です。

于 2013-12-04T09:36:46.650 に答える
-1

apache lib http接続を使用してみませんか

このようなもの、非同期タスク内

    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost("http://server.com");
    HttpResponse response = httpclient.execute(httppost);
    if(response!=null)
    {
        final  String responseBody =EntityUtils.toString(response.getEntity());
        if (responseBody != null) 
        {  



        }

    }
于 2013-12-18T14:39:32.607 に答える