2

呼び出し後の応答時間が長い問題をトラブルシューティングしてHttpClient.execute(...)います。HTTP 要求のパフォーマンスを最適化するために、クライアントですべてのことを行っていることを確認したいと思います。

ネットワークへのリクエストには 1 ~ 40 秒かかりますが、平均すると約 4 秒かかります。私は強力な WiFi 接続を使用しており、速度に問題がないため、ネットワーク接続がボトルネックになっているとは思いません。

HttpClient は次のように設定されています。

public static final int MAX_TOTAL_CONNECTION = 20;
public static final int MAX_CONNECTIONS_PER_ROUTE = 20;
public static final int TIMEOUT_CONNECT = 15000;
public static final int TIMEOUT_READ = 15000;

SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));

HttpParams connManagerParams = new BasicHttpParams();
ConnManagerParams.setMaxTotalConnections(connManagerParams, MAX_TOTAL_CONNECTIONS);
ConnManagerParams.setMaxConnectionsPerRoute(connManagerParams, new ConnPerRouteBean(MAX_CONNECTIONS_PER_ROUTE));

HttpConnectionParams.setConnectionTimeout(connManagerParams, TIMEOUT_CONNECT);
HttpConnectionParams.setSoTimeout(connManagerParams, TIMEOUT_READ);

ThreadSafeClientConnManager cm = new ThreadSafeClientConnManager(new BasicHttpParams(), schemeRegistry);
sHttpClient = new DefaultHttpClient(cm, connManagerParams);

主観的な質問ですが、これを設定するためのより最適な方法はありますか?

HttpClient.execute(...)への呼び出しをタイム キャプチャでラップしているため、への呼び出しの下にあるすべてのexecute(...)部分で、平均 4 秒以上が費やされます。

4

2 に答える 2

0

試す

HttpConnectionParams.setTcpNoDelay(httpClient.getParams(), true);

無料のwireshark/sharkwireを実行して、あなたが見たものを教えてください.

http://www.wireshark.org/

これにより、時間が費やされている場所がわかります。

于 2012-07-23T23:48:58.863 に答える
0

しばらく前にこれを修正しましたが、他の人がここで見つけた可能性があるため、問題/解決策として見つかったものを投稿します。

当初は、リクエストが に到達するとすぐに実行されると想定していましたHttpClient.execute(...)。私の場合、同じルートで接続を再利用する接続プールを使用していたため、これは当てはまりませんでした。さらに、クライアントはルートごとに 2 つの接続を使用するように構成されました。私のコード ブロックの 1 つが API 応答の解析に失敗し、接続が確実に閉じられなかったことが判明しました。アプリが続行すると、複数のデータ ストリームが開いたままになり、他の保留中の接続がブロックされました。この制限されたスループットが、私が経験していた誤った動作の原因でした。

のようなものを使用することEntityUtils.toString(entity)は、コンテンツを消費し、終了時に接続が閉じられることを保証するためのより良い方法になりました.

于 2014-02-04T08:24:09.407 に答える