2

データに対する最初のhttpリクエストが非常に遅いのはなぜですか?

私は次の行で何かを使用しています:3つのHTTPリクエストを連続して(順番に)実行してから、指定された時間待機し、3つのHTTPリクエストを実行して再度ループします。

基本的にも機能しているkeep-aliveを使用していますが、最初のHTTPリクエストでは、3つのHTTPリクエストで開始するたびに2秒のペナルティがあります。最初のHTTPリクエストのみにこの2秒のペナルティがあります。連続するHTTPリクエスト間の待機時間を200ミリ秒程度に短縮すると、最初のリクエストにこの2秒のペナルティが発生することなく、すべてのリクエストが高速になります。

明らかに、これは最初のリクエストがキープアライブ接続を使用しない可能性があるように聞こえますが、実際にはそうではありません。サーバーでtcpdumpを実行すると、すべての要求が同じTCP接続を使用しており、新しい接続を閉じて再度構築する必要がないことがはっきりとわかります。サーバーのキープアライブ設定は60秒に設定されていますが、アプリでの待機時間はたとえば5秒です。また、WIFIに切り替えると、この動作がわかりません。同時に待機すると、すべてのリクエストが高速になります。

http接続コードはHttpURLConnectionを使用しており、次のようになります。

m_res.error = null;
HttpURLConnection connection;
try {
    connection = (HttpURLConnection)(new URL(m_url + "/" + m_call.command).openConnection());
    connection.setDoOutput(true); // triggers POST.
    connection.setDoInput(true);
    connection.setRequestProperty("Accept-Charset", m_charset);
    connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded;charset=" + m_charset);
    connection.setRequestProperty("Connection", "Keep-Alive");
    connection.setRequestProperty("Accept-Encoding", "gzip");
    //connection.setChunkedStreamingMode(0);
    OutputStream output = null;

    try {
        output = connection.getOutputStream();
        output.write(m_call.query_string.getBytes(m_charset));
        InputStream response = null;
        try {
            response = connection.getInputStream();
            if ("gzip".equals(connection.getContentEncoding())) {
                response = new GZIPInputStream(response);
            }
        }
        catch (IOException e) {
            response = connection.getErrorStream();
        }
        if (response == null) {
            m_res.error = "Connection Error";
        }
        else {
            m_res.body = getAsString(response);
            m_res.status = connection.getResponseCode();
        }
    } 
    catch (IOException e) {
        e.printStackTrace();
        m_res.error = "Connection Error";
    }
    finally {
        if (output != null) 
                try { 
                    output.close(); 
                } catch (IOException logOrIgnore) {}
        }
    }
}
4

3 に答える 3

0

これに対する考えられる答えの1つは、IPの下のレイヤーでのデバイスのデータ接続がステータスを変更していることだと思います。例5秒。

于 2012-08-24T15:18:03.087 に答える
0

ネットワークレベルで何が起こっているかを確認できるAROツールを確認してください。https://developer.att.com/developer/aro アナライザーは、発生しているさまざまなネットワーク通信をすべて表示し、ネットワークをより効率的に使用するのに役立ちます。コメントに投稿したもう1つのリンクは、ステートマシンと、アイドル状態のさまざまな時間に接続で何が起こるかを説明しています。

于 2012-08-29T13:21:28.120 に答える
0

ボレーライブラリとその機能を使用できます。1。リクエストのキューイングと優先順位付け2.効果的なリクエストキャッシュとメモリ管理3.ニーズに合わせたライブラリの拡張性とカスタマイズ4.リクエストのキャンセル

このリンクを使用してくださいhttp://www.androidhive.info/2014/05/android-working-with-volley-library-1/

于 2015-06-13T09:11:46.727 に答える