1

Android デバイスで SOAP サービスを使用していますが、応答としてサーバーから 7 MB のファイルを取得します。これにより、入力ストリームを文字列に変換するときにメモリ不足エラーでアプリがクラッシュします。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拡張時にデータの 2 倍のメモリが必要です。新しい、より大きな (ほぼ確実に必要なサイズよりも大きい) char 配列が割り当てられ、コピーが作成されます。その後で、古い配列を破棄できます。

すべての行を集めて、行ArrayList<String>ごとの文字列参照のサイズだけで、成長するのが安くなります。読み終わったら、ループ内で正確な長さを数え、正確に必要なサイズの StringBuilder を割り当てることができます。最初にストリームを閉じます。または、文字列に変換せずにリストを直接再利用できるかもしれません。

于 2014-08-12T06:57:59.133 に答える