Android Out of Memory从jSON解析base64字符串

时间:2015-06-05 15:58:48

标签: android json base64 out-of-memory gson

解析大型JSON字符串时出现内存不足错误。

我见过几个使用GSON流式传输大型JSON文档的例子,但我的问题是我的JSON文档没有数百或数千个“行”,可以有效地进行标记。相反,它包含一个带有大约15MB数据的base64节点,例如

{
    "id":"somefile",
    "base64":"super long base64 string...."
}

如何将此JSON文档中的单个base64字符串解析为文件并保存到文件系统而不会耗尽内存?使用StringBuilder将base64节点解析为String是导致当前OOM错误的原因。 e.g。

...
InputStream is = con.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
StringBuilder sb = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
    sb.append(line); //out of memory
}
reader.close();
//parse the response into a POJO
MyFileClass f = new Gson().fromJson(sb.toString(), MyFileClass.class);

2 个答案:

答案 0 :(得分:1)

看起来我找到了解决方案。看来在使用GSON之前无需将JSON解析为String。您可以将InputStream直接传递给GSON,如下例所示(与问题中的代码进行比较):

InputStream is = con.getInputStream();
BufferedReader buff_reader = new BufferedReader(new InputStreamReader(is));
//use GSON to create a POJO directly from the input stream
MyType instance = new Gson().fromJson(buff_reader, MyType.class);

我不完全确定是否需要使用BufferedReader,因为fromJSON方法会直接接受InputStreamReader,但这似乎是一个好主意。

答案 1 :(得分:-1)

我不建议你通过json下载大文件。但是如果你真的想要这个,你应该在AndroidManifest.xml中的应用程序标签上加上以下属性:

<application 
    android:largeHeap="true">
    . . .
</application>