繁体   English   中英

Android StringBuilder内存不足,带有大型XML文件

[英]Android StringBuilder out of memory with large XML file

我在Android设备上使用了肥皂服务,并且作为响应,我从服务器获取了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();
}

最明显的答案是使用流并解析结果。 如果您要解析的是XML文件,那么SAX可能是您的最佳途径。

StringBuilder需要的内存是扩展时的两倍。 将分配一个新的,更大的(几乎肯定大于所需的)字符数组,并进行复制,然后才可以丢弃旧的数组。

将所有行收集到更便宜的ArrayList<String> ,每行只有String引用的大小。 阅读完之后,您可以在一个循环中计算确切的长度,并分配恰好需要的大小的StringBuilder。 首先关闭流。 或者,也许您可​​以直接重用列表,而无需转换为字符串。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM