2

次のメソッドを使用して webapi からデータをキャッチします。

public static String sendRequest(String requestURL, String data)
        throws IOException {
    URL url = new URL(requestURL + "?" + data);
    URLConnection conn = url.openConnection();
    conn.setReadTimeout(10000);
    BufferedReader in = new BufferedReader(new InputStreamReader(
            conn.getInputStream()));

    String inputLine;
    StringBuilder answerBuilder = new StringBuilder("");
    try {
        while ((inputLine = in.readLine()) != null)
            answerBuilder.append(inputLine);
        in.close();
    } catch (Exception e) {
    }

    return answerBuilder.toString();
}

一部のリクエストでは、HeapSize が小さすぎるために OutOfMemoryError が発生します。

(...)Caused by: java.lang.OutOfMemoryError: (Heap Size=17927KB, Allocated=14191KB, Bitmap Size=2589KB)
at java.lang.AbstractStringBuilder.enlargeBuffer(AbstractStringBuilder.java:95)
at java.lang.AbstractStringBuilder.append0(AbstractStringBuilder.java:132)
at java.lang.StringBuilder.append(StringBuilder.java:272)
at java.io.BufferedReader.readLine(BufferedReader.java:423)
at com.elophant.utils.HTTPUtils.sendRequest(HTTPUtils.java:23)
at (..)

私はすでに StringBuilder のような通常の String 操作から交換しましString answer += inputLineたが、これは役に立ちませんでした。この問題を解決するにはどうすればよいですか? export JVM_ARGS="-Xmx1024m -XX:MaxPermSize=256m"Android アプリのオプションとして、最大ヒープ サイズを増やすことはできません。

4

5 に答える 5

1

stringbuilder の内容をファイルに書き込み、時々クリアする必要があります。

于 2013-04-26T13:39:41.310 に答える
1

文字列が本当に大きい場合は、一時的にファイルに保存し、チャンクで処理する (または受信中にチャンクで処理する) 必要があります。

于 2013-04-26T13:40:41.463 に答える