内存溢出的异常,当对象为JSON
java.lang.OutOfMemoryError
对一些用户(不总是)当我转换对象的列表使用JSON GSON到。请告诉我如何解决这个问题。
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if(myList != null && !myList.isEmpty()) {
//exception at this line
String myJson = new Gson().toJson(myList, myList.getClass());
outState.putString(MY_LIST, myJson);
}
outState.putInt(NEXT_PAGE, getNextPage());
}
myList中是我的自定义对象和列表的大小的名单是400KB到600KB
这将取决于你的列表的大小。你为什么不使用流式API https://sites.google.com/site/gson/streaming
更具体像
public String writeListToJson(List myList) throws IOException {
ByteArrayOutputStream byteStream =new ByteArrayOutputStream();
OutputStreamWriter outputStreamWriter=new OutputStreamWriter(byteStream ,"UTF-8");
JsonWriter writer = new JsonWriter(outputStreamWriter);
writer.setIndent(" ");
writer.beginArray();
Gson gson = new GsonBuilder().excludeFieldsWithoutExposeAnnotation().setPrettyPrinting().create();
for (Object o : myList) {
gson.toJson(o, o.class, writer);
}
writer.endArray();
writer.close();
return byteStream.toString("UTF-8");
}
如果要将最终结果转换为String,为什么要使用流'JsonWriter'? – pskink
@pskink如果你看到OP,他正在将“string”写回outState'outState.putString(MY_LIST,myJson);'这是Gson转换器,它不是一次转换大的List,因此是gson的助手。所以他可以使用这个util类,从Gson中通过OOM,并根据需要使用该字符串。 – Optional
好,所以在你的方法中有1)big'myList' 2)大的'ByteArrayOutputStream'必须存储'myList'的内容和3)大'String'作为'byteStream.toString'的结果问题是这些3大数据对象在“OOM”异常情况下会有所帮助? – pskink
myList中是我的自定义对象和列表的大小的名单是400KB到600KB
做不是把那个保存实例状态Bundle
。 OutOfMemoryError
只是你的一个担心。您大部分时间都会遇到FAILED BINDER TRANSACTION
的崩溃,因为您的应用中进行的所有IPC同步交易都有1MB的限制。
如果你正在尝试处理配置更改,用别的东西来守住这样的信息:
- 保留片段
onRetainNonConfigurationInstance()
-
ViewModel
从Android架构组件 - 等
如果您正在尝试处理流程终止/应用程序重新启动,在已保存的实例状态Bundle
中放置一个标识符,这将允许您从持久性存储(数据库,纯文件等)重新加载此列表。
检查myList的大小 – Stultuske
@Stultuske它的大小很大。但我必须转换大型列表。有什么办法吗? –
myList是一个常规列表吗? 'myList'中包含的对象类是什么? – Haem