通过Gson将对象转换为Json时出现OutOfMemory异常

时间:2017-09-27 11:00:05

标签: java android json gson savestate

我正在

  

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

2 个答案:

答案 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()
  • 来自Android架构组件的
  • ViewModel

如果您正在尝试处理进程终止/应用程序重新启动,请在已保存的实例状态Bundle中放置一个标识符,以允许您从持久性存储(数据库,纯文件等)重新加载此列表