我在android设备上使用soap服务,作为响应,我从服务器获得了7mb的文件。这会导致我的应用程序崩溃,在将输入流转换为字符串时出现内存不足错误。MemoryAnalyzer显示内存已分配给StreamBuilder。处理这么大的回复最好的方法是什么?
HttpEntity entity = new StringEntity(soap.toString());
httppost.setEntity(entity);
HttpResponse response = httpclient.execute(httppost);
HttpEntity r_entity = response.getEntity();
if( r_entity != null ) {
result = inputStreamToString(r_entity.getContent());
}
...
//convert stream to string
public static String inputStreamToString(InputStream stream) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(stream));
StringBuilder sb = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null) {
sb.append(line + "\n");
}
br.close();
return sb.toString();
}发布于 2012-05-16 23:06:25
最明显的答案是使用流,并在结果到来时对其进行解析。如果您正在解析的是XML文件,那么SAX可能是最适合您的方法。
发布于 2014-08-12 14:57:59
StringBuilder需要的内存是其在扩展时拥有的数据的两倍。将分配一个新的、更大的(几乎可以肯定大于所需的)字符数组,并创建一个副本,然后才能丢弃旧的数组。
将所有行收集到更便宜的ArrayList<String>中,每行只有一个字符串引用的大小。读完之后,您可以在循环中计算确切的长度,并分配所需大小的StringBuilder。首先关闭流。或者,您可以直接重用列表,而无需转换为字符串。
https://stackoverflow.com/questions/10621261
复制相似问题