我正在使用以下方法从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应用程序的一个选项来增加最大堆大小。
String answer += inputLine
export JVM_ARGS="-Xmx1024m -XX:MaxPermSize=256m"
一种解决方案是将要下载的内容持久保存到存储中。
根据您要下载的内容,可以在读取过程中对其进行解析,并将其存储在SQL Lite数据库中。这将允许您之后使用查询语言来处理数据。如果要下载的文件是JSON或XML,这将非常有用。
在JSON中,您可以InputStream像以前一样获取,并使用JSON Reader读取流。对于从JSON读取的每条记录,您都可以将其存储在一个表(或更多表,具体取决于每条记录的结构)中。这种方法的好处是,最后不需要文件处理,并且已经将数据分发到数据库中的表中以备查询。
InputStream