以下代码:

//
// 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文件(最多500kb),每次请求可能需要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;
}

(仅供参考:datelastlog是静态变量)
我这样修改了上面的代码:
//
// This line takes too long on big responses
//
logger(TAG, "toString ...");
String content = EntityUtils.toString(response.getEntity());
logger(TAG, "toString OK");

提前谢谢。

最佳答案

好吧,第一件简单的事情就是确保您的web服务器在http响应中提供了一个正确的ContentLength头。查看httpcore的EntityUtils类的源代码的某个版本,我们可以看到,如果这个信息不可用,那么它默认使用的CharArrayBuffer值仅为4k,在写入时缓冲1k数据。在第4次、第5次以及随后对CharArrayBuffer的写入(一直到500次,你说),它逐渐将缓冲区增加1k…使用System.arrayCopy()。讨厌。你的表演很糟糕。
不过,如果速度对你来说真的很重要,那么你将避免完全使用EntityUtils。它只是不负责把一个流变成一个临时的500kString。尤其是在电话里!你需要找到或写一个Base64DecodingInputStreamBase64DecodingReader来把你的InputStreamresponse.getEntity().getContent()中包装起来,然后输入…而不是String。给你的分析器。

10-08 04:06