内存溢出的异常,当对象为JSON

问题描述:

我得到内存溢出的异常,当对象为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

+0

检查myList的大小 – Stultuske

+0

@Stultuske它的大小很大。但我必须转换大型列表。有什么办法吗? –

+0

myList是一个常规列表吗? 'myList'中包含的对象类是什么? – Haem

这将取决于你的列表的大小。你为什么不使用流式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"); 
} 
+0

如果要将最终结果转换为String,为什么要使用流'JsonWriter'? – pskink

+0

@pskink如果你看到OP,他正在将“string”写回outState'outState.putString(MY_LIST,myJson);'这是Gson转换器,它不是一次转换大的List,因此是gson的助手。所以他可以使用这个util类,从Gson中通过OOM,并根据需要使用该字符串。 – Optional

+0

好,所以在你的方法中有1)big'myList' 2)大的'ByteArrayOutputStream'必须存储'myList'的内容和3)大'String'作为'byteStream.toString'的结果问题是这些3大数据对象在“OOM”异常情况下会有所帮助? – pskink

myList中是我的自定义对象和列表的大小的名单是400KB到600KB

不是把那个保存实例状态BundleOutOfMemoryError只是你的一个担心。您大部分时间都会遇到FAILED BINDER TRANSACTION的崩溃,因为您的应用中进行的所有IPC同步交易都有1MB的限制。

如果你正在尝试处理配置更改,用别的东西来守住这样的信息:

  • 保留片段
  • onRetainNonConfigurationInstance()
  • ViewModel从Android架构组件

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