2017-09-27 2 views
0

ich bin immerOutOfMemory Ausnahme bei der Konvertierung von Objekt zu Json durch Gson

java.lang.OutOfMemoryError

für einige Benutzer (nicht immer), wenn ich eine Liste von Objekt JSON mit Gson konvertieren . Bitte sag mir, wie ich das beheben kann.

@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 ist die Liste meiner benutzerdefinierten Objekts und der Größe der Liste 400kb zu 600kb

+0

Überprüfen Sie die Größe dieser myList – Stultuske

+0

@StulTuske es ist Größe ist groß. aber ich muss große Liste umwandeln. gibt es irgendeinen Weg? –

+0

Ist 'myList' eine reguläre Liste? Was ist die Klasse der Objekte in 'myList'? – Haem

Antwort

1

ist dies auf die Größe Ihrer Liste ab. Warum Sie API nicht verwenden Streaming https://sites.google.com/site/gson/streaming

Um genauer zu sein, etwas wie

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

Warum würden Sie Streaming 'JsonWriter' verwenden, wenn Sie das Endergebnis in' String' konvertieren? – pskink

+0

@pskink Wenn Sie OP sehen, schreibt er die "Zeichenkette" zurück, outState outState.putString (MY_LIST, myJson); 'Es ist der Gson-Konverter, der nicht die große Liste auf einmal konvertiert und daher ein Helfer für gson ist. Er kann also diese util-Klasse verwenden, über OOM von Gson hinausgehen und die Zeichenfolge verwenden, wie er es möchte. – Optional

+0

ok so in Ihrer Methode gibt es 1) große 'myList' 2) große' ByteArrayOutputStream', die 'myList' Inhalt speichern und 3) große' String' als Ergebnis von 'byteStream.toString' die Frage ist, wie diese 3 große Datenobjekte würden im Falle einer "OOM" -Ausnahme helfen? – pskink

1

myList ist die Liste meiner benutzerdefinierten Objekts und der Größe der Liste ist 400kb zu 600kb

Do NICHT setzen Sie das in den Zustand der gespeicherten Instanz Bundle. OutOfMemoryError ist nur eine Ihrer Sorgen. Sie werden die meiste Zeit mit einem FAILED BINDER TRANSACTION abstürzen, da es eine Begrenzung von 1 MB für alle gleichzeitigen IPC-Transaktionen in Ihrer App gibt.

Wenn Sie versuchen, mit Konfigurationsänderungen umgehen, verwenden Sie etwas anderes auf diese Information zu halten:

  • Retained Fragment
  • onRetainNonConfigurationInstance()
  • ViewModel aus den Android Architektur Komponenten
  • usw.

Wenn Sie versuchen, mit Prozess umzugehen Beenden/App-Neustart, setzen Sie einen Bezeichner in den Status der gespeicherten Instanz Bundle, mit dem Sie diese Liste aus einem persistenten Speicher (Datenbank, einfache Datei usw.) erneut laden können.

Verwandte Themen