EntityUtils toString在大响应上花费的时间太长

时间:2012-12-03 15:47:13

标签: java http post

以下代码:

//
// 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文件是基于64位编码并包装成XML标签(接收后解析字符串)。

有没有办法让我的String响应更快?

编辑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");

提前致谢。

1 个答案:

答案 0 :(得分:4)

嗯,首先要尝试的简单方法是确保您的Web服务器在HTTP响应中提供正确的ContentLength标头。查看HttpCore EntityUtils类的某些源代码版本,我们看到如果此信息不可用,则默认使用仅{4}的CharArrayBuffer,缓冲1k数据写作的时候。在第4次,第5次和后续写入CharArrayBuffer(一直到500,你说),它逐渐将缓冲区增加1k ...使用System.arrayCopy()。呸。你的表现很痛苦。

如果速度对您来说非常重要,那么您将完全避免使用EntityUtils。它只是没有责任将流转换为临时500k String ...尤其是在手机上!您需要找到或写一个Base64DecodingInputStreamBase64DecodingReader来封送InputStream来自response.getEntity().getContent(),并提供...而不是String } ...到您的解析器。