小编典典

由大字符串引起的OutOfMemoryException

java

我正在使用以下方法从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 (..)

我已经从正常的String操作(如String answer += inputLineStringBuilder)换成了StringBuilder,但这没有帮助。我怎么解决这个问题?通过export JVM_ARGS="-Xmx1024m -XX:MaxPermSize=256m"isnt作为其Android应用程序的一个选项来增加最大堆大小。


阅读 271

收藏
2020-11-26

共1个答案

小编典典

一种解决方案是将要下载的内容持久保存存储中

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

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

2020-11-26