2

Im using using following Method to catch Data from a 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();
}

With some requests, this leads to a OutOfMemoryError caused by a too small HeapSize:

(...)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 (..)

I already swapped from normal String operations like String answer += inputLine to a StringBuilder but this didnt help. How can i solve this Problem? Increasing maximum heap size via export JVM_ARGS="-Xmx1024m -XX:MaxPermSize=256m" isnt an option as its an android app.

4

5 回答 5

3

使用文件进行临时存储,例如当硬盘驱动器因内存不足而开始分页时。

于 2013-04-26T13:39:23.543 回答
2

一种解决方案是将下载的内容保存到存储中。

根据您下载的内容,您可以在读取过程中对其进行解析并将其存储在SQL Lite DataBase中。这将允许您在之后使用查询语言来处理数据。如果正在下载的文件是 JSON 或 XML,这将非常有用。

在 JSON 中,您可以像以前一样获得并使用JSON ReaderInputStream读取流。对于从 JSON 读取的每条记录,您可以存储在一个表中(或更多表,具体取决于每条记录的结构)。这种方法的好处是最终您不需要文件处理,并且您已经将数据分布在数据库中的表中,准备好进行查询。

于 2013-04-26T13:41:26.983 回答
1

您应该将 stringbuilder 内容写入文件并不时清除它。

于 2013-04-26T13:39:41.310 回答
1

如果您的 String 真的那么大,您将需要将其临时存储在文件中并分块处理(或在收到时分块处理)

于 2013-04-26T13:40:41.463 回答
0

不适合胆小的人,而是编写自己的MyString类,每个字符使用一个字节~ 节省 50% 的内存!因此,MyStringBuilder上课。仅假设您正在处理 ASCII。

于 2013-04-26T13:45:42.030 回答