1

我在 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();
}
4

2 回答 2

1

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

于 2012-05-16T15:06:24.503 回答
0

StringBuilder需要两倍于扩展时的数据的内存。将分配一个新的、更大的(几乎肯定大于所需的)字符数组并制作一个副本,然后才能丢弃旧数组。

将所有行收集ArrayList<String>到增长成本较低的位置,每行只需一个字符串引用的大小。完成阅读后,您可以计算循环中的确切长度并分配确切需要大小的 StringBuilder。先关闭流。或者,也许您可​​以直接重用列表而不转换为字符串。

于 2014-08-12T06:57:59.133 回答