簡體   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