1

次のコード:

//
// Define HTTP Post and content
//
HttpPost httppost = new HttpPost(url);
ByteArrayEntity be = new ByteArrayEntity(strPostData.getBytes("UTF-8"));
httppost.setEntity(be);
//
// Define HTTP Client
// 
HttpClient httpclient = new DefaultHttpClient();
HttpParams httpParameters = httpclient.getParams();
HttpConnectionParams.setConnectionTimeout(httpParameters, 10 * 1000);
//      
// Sets the default socket timeout
// in milliseconds which is the timeout for waiting for data.
//
int timeoutSocket = 10000;
HttpConnectionParams.setSoTimeout(httpParameters, timeoutSocket);
HttpResponse response = httpclient.execute(httppost);
//      
// This line takes too long on big responses
//
String content = EntityUtils.toString(response.getEntity());

応答に大量のバイトが含まれている場合、最後の行(EntityUtils.toString)に時間がかかりすぎます。

HTTP Postを使用してPDFファイル(最大500 Kb)を取得していますが、リクエストごとに1〜2秒かかる場合がありますが、これは長すぎます。

情報の編集:PDFファイルはbase 64でエンコードされ、XMLタグにラップされます(文字列は受信後に解析されます)。

文字列応答をより速く取得する方法はありますか?

編集2:EntityUtils.toStringにかかった時間を知るために、メソッドを作成しました:

public static void logger(String header, String content) {
    Date dateActualLog = new Date();
    long milliseconds = (dateActualLog.getTime() - dateLastLog.getTime());
    Log.d(header, String.valueOf(milliseconds) + " => " + content);
    dateLastLog = dateActualLog;
}

(fyi:dateLastLogは静的変数です)

上記のコードを次のように変更しました:

//      
// This line takes too long on big responses
//
logger(TAG, "toString ...");
String content = EntityUtils.toString(response.getEntity());
logger(TAG, "toString OK");

前もって感謝します。

4

1 に答える 1

4

ContentLengthさて、最初に試す簡単なことは、WebサーバーがHTTP応答で正しいヘッダーを提供していることを確認することです。HttpCoreのEntityUtilsクラスのソースコードのいくつかのバージョンを見ると、この情報が利用できない場合、CharArrayBuffer書き込み時にデフォルトで4kのデータを使用し、1kのデータをバッファリングしていることがわかります。4日目、5日目、およびそれ以降の書き込みCharArrayBuffer(500まで)では、を使用してバッファを1kずつ徐々にインクリメントしますSystem.arrayCopy()。うん。そこにあなたのパフォーマンスの悲惨さがあります。

ただし、速度が非常に重要な場合は、EntityUtils完全に使用することは避けてください。ストリームを一時的な500kに変えることは、String特に電話では責任がありません。Base64DecodingInputStreamまたはを検索または作成してfromBase64DecodingReaderをラップし、...ではなく...をパーサーにフィードする必要があります。InputStreamresponse.getEntity().getContent()String

于 2012-12-03T17:16:10.763 に答える