Speichern Sie benutzerdefiniertes Objektarray im Instanzstatus

Ich habe eine List<CustomObject> (wo CustomObject aus einer externen Bibliothek kommt – ich kann keine Änderungen daran vornehmen). Ich möchte das in onSaveInstanceState(Bundle) speichern, aber ich kann es nicht scheinen. Hier sind die Optionen, die ich ausprobiert habe:

 outState.putSerializable(KEY, (ArrayList<CustomObject>) myList); // because myList is instantiated as an ArrayList outState.putSerializable(KEY, myList.toArray()); 

Beide Optionen funktionieren beim Umschalten der Ausrichtung am Telefon (ja, onSaveInstanceState wird beim Umschalten der Ausrichtung aufgerufen – ich habe eine Logcat eingecheckt). Wenn die aktuelle Aktivität jedoch versucht, eine andere zu starten (mit startActivity(Intent) ), pausiert Android die aktuelle Aktivität und ruft onSaveInstanceState() erneut auf. Dieses Mal, es scheitert, aus irgendeinem Grund unbekannt zu mir. Die fischartige Sache ist, dass onSaveInstanceState() erfolgreich ausgeführt wird. Die Stapelspur zeigt nicht auf einen meiner Code:

  • In Eclipse ist es möglich, alle Methoden im Projekt zu finden, die einen bestimmten Parametertyp verwenden?
  • Stil für die Ansicht, die in der Webansicht auftaucht, wenn ein Benutzer ein Kombinationsfeld auswählt
  • Bewegen von Android / Eclipse-Projekt auf neuen PC
  • Erkennung von Google Cast
  • Tabbed Dialog mit Fragmenten im Widget
  • Ist QT für Android- und iPhone-Plattformen verfügbar?
  •  E/AndroidRuntime(23898): java.lang.RuntimeException: Parcel: unable to marshal value my.custom.Object@5e07e43b E/AndroidRuntime(23898): at android.os.Parcel.writeValue(Parcel.java:1087) E/AndroidRuntime(23898): at android.os.Parcel.writeArray(Parcel.java:519) E/AndroidRuntime(23898): at android.os.Parcel.writeValue(Parcel.java:1072) E/AndroidRuntime(23898): at android.os.Parcel.writeMapInternal(Parcel.java:469) E/AndroidRuntime(23898): at android.os.Bundle.writeToParcel(Bundle.java:1445) E/AndroidRuntime(23898): at android.os.Parcel.writeBundle(Parcel.java:483) E/AndroidRuntime(23898): at android.app.ActivityManagerProxy.activityPaused(ActivityManagerNative.java:1427) E/AndroidRuntime(23898): at android.app.ActivityThread.handlePauseActivity(ActivityThread.java:3106) E/AndroidRuntime(23898): at android.app.ActivityThread.access$2400(ActivityThread.java:119) E/AndroidRuntime(23898): at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1870) E/AndroidRuntime(23898): at android.os.Handler.dispatchMessage(Handler.java:99) E/AndroidRuntime(23898): at android.os.Looper.loop(Looper.java:123) E/AndroidRuntime(23898): at android.app.ActivityThread.main(ActivityThread.java:4363) E/AndroidRuntime(23898): at java.lang.reflect.Method.invokeNative(Native Method) E/AndroidRuntime(23898): at java.lang.reflect.Method.invoke(Method.java:521) E/AndroidRuntime(23898): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860) E/AndroidRuntime(23898): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618) E/AndroidRuntime(23898): at dalvik.system.NativeStart.main(Native Method) 

    Gibt es eine Möglichkeit, benutzerdefinierte Objekte im Instanzzustand zu speichern?

  • Eclipse zeigt Fehler, aber ich kann sie nicht finden
  • Schwimmende Action-Taste Scroll sonderbares Verhalten
  • IntelliJ IDEA Logcat Navigation
  • Verwenden von Java-Bibliothek im iOS-Projekt
  • OutOfMemory Ausnahme bei der Umwandlung von ByteArray in String?
  • ArrayIndexOutOfBoundsException bei Verwendung von ListAdapter
  • 5 Solutions collect form web for “Speichern Sie benutzerdefiniertes Objektarray im Instanzstatus”

    Machen Sie Ihr CustomObject implementieren Parcelable und verwenden Sie:

     outState.putParcelable(KEY, myList); onSaveInstanceState(outState); 

    Überprüfen Sie auch dieses Tutorial.

    EDIT nach CommonsWare Kommentar:

    Wenn Ihr CustomObject nicht implementiert Serializable oder Parcelable Ich würde versuchen, Parcelable es in ein Objekt von Ihrem eigenen und fügen Sie hinzu:

    • private void readObject(ObjectInputStream aStream) throws IOException, ClassNotFoundException { /*Your deserialization */ }
    • private void writeObject(ObjectOutputStream aStream) throws IOException { /*Your serialization */}

    Habe deine List<CustomObject> von einem Service gehalten und kannst du deinen Aktivitäten über das lokale Bindungsmuster zugänglich machen.

    Nicht nur musst du dich nicht darum kümmern, dich in deinem Instanzzustand zu halten, aber du hast ein bisschen bessere Kontrolle über die Lebensdauer dieser Objekte im Gedächtnis. Instanz-Lebensdauer wird von Android gesteuert. wie lange ein Service auf die Objekte hält, wird von Ihnen kontrolliert. Besonders wenn CustomObject groß CustomObject könnte oder die Liste lang sein könnte, würde ich lieber eine größere Kontrolle darüber haben, wie lange das RAM verbraucht ist.

    Wenn dies in erster Linie um Orientierungsänderungen zu behandeln ist, könnte Activity#onRetainNonConfigurationInstance() was tun?

    eine Aktivität kann diese API verwenden, um umfangreichen Zustand von der alten zur neuen Aktivitätsinstanz, von geladenen Bitmaps, zu Netzwerkverbindungen, zu gleichmäßig aktiv laufenden Threads zu verbreiten. Beachten Sie, dass Sie keine Daten ausgeben sollten, die sich je nach Konfiguration ändern können, einschließlich aller Daten, die von Ressourcen wie Strings, Layouts oder Drawables geladen werden.

    Diese API wird Ihnen nicht helfen, wenn Sie versuchen, mehr zu tun, als Daten über Konfigurationsänderungen zu bestehen.

    Soweit ich weiß, ist SavedInstanceState dazu gedacht, die UI-Konfiguration der Aktivität zu speichern (wie Standard-Android-UI-Widgets, zB Textfeld, werden automatisch konserviert).

    Wenn Sie ein benutzerdefiniertes Objekt zwischen verschiedenen Aktivitätsrelaiseln speichern möchten (dies gilt nicht für das vom Benutzer initiierte Finishing einer Aktivität, indem Sie auf die Schaltfläche "Zurück" klicken, aber es gilt zB für Orientierungsänderungen). Verwenden Sie den folgenden Code, um ein Objekt zu behalten:

     // maintain a reference to the EchoServer object when the activity is recreated @Override public Object onRetainNonConfigurationInstance() { return <<your object of choice>>; } 

    Und in der Methode onCreate (Bundle savedInstanceState) kannst du das Objekt dann abrufen:

      // if there is a saved instance state, restore the state if (savedInstanceState != null) { <<yourObject>> = (<<your object's class) getLastNonConfigurationInstance(); 

    Warum nicht nur das Objekt auf die SD-Karte speichern? Sie können ein Beispiel sehen, wie ich das auf meinem Blog verwende >> http://androidworkz.com/2010/07/06/source-code-imageview-flipper-sd-card-scanner/

     public void saveArray(String filename, String[] output_field) { try { FileOutputStream fos = new FileOutputStream(filename); GZIPOutputStream gzos = new GZIPOutputStream(fos); ObjectOutputStream out = new ObjectOutputStream(gzos); out.writeObject(output_field); out.flush(); out.close(); } catch (IOException e) { e.getStackTrace(); } } public String[] loadArray(String filename) { try { FileInputStream fis = new FileInputStream(filename); GZIPInputStream gzis = new GZIPInputStream(fis); ObjectInputStream in = new ObjectInputStream(gzis); String[] read_field = (String[])in.readObject(); in.close(); return read_field; } catch (Exception e) { e.getStackTrace(); } return null; } 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.