我正在
java.lang.OutOfMemoryError
对于某些用户(并非总是),当我使用Gson将对象列表转换为JSON时。请告诉我如何解决这个问题。
@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
答案 0 :(得分:1)
这取决于列表的大小。为什么不使用流媒体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");
}
答案 1 :(得分:1)
myList是我的自定义对象列表,列表大小为400kb到600kb
不将其置于已保存的实例状态Bundle
中。 OutOfMemoryError
只是您的一个担忧。在大多数情况下,您将崩溃FAILED BINDER TRANSACTION
,因为您的应用中所有同时进行的IPC交易都有1MB的限制。
如果您正在尝试处理配置更改,请使用其他内容来保留此信息:
onRetainNonConfigurationInstance()
ViewModel
如果您正在尝试处理进程终止/应用程序重新启动,请在已保存的实例状态Bundle
中放置一个标识符,以允许您从持久性存储(数据库,纯文件等)重新加载此列表