Wie behalte ich ein komplexes Objekt in der Aktivität Neustart?

Sagen, ich habe ein Java Bean Objekt, das serialisierbar ist. Ich möchte es sicher ablegen, wenn eine Aktivität onDestroy () absichtlich durchläuft (dh onSaveInstanceState () wird nicht aufgerufen).

Ich suche nach einem Weg, der nicht mit der Erstellung einer Datenbank und dem Schreiben des Objekts zu dem (meistens seit a) Android-DB-API ist schrecklich und b) da Datenbanken machen Anwendungs-Updates ein Albtraum, weil es keine anständige Unterstützung für die Anwendung von Migrationen ).

  • Wie installiere ich eine JRE oder JDK, um die Android Developer Tools unter Windows 7 auszuführen?
  • Fehler: Gradle: Ausführung fehlgeschlagen für Task ': app: preDexDebug'
  • Kann nicht in eine erweiterte Klasse in Java geworfen werden
  • Wie kann ich Skalierung in Android Imageview verhindern?
  • Android: Erstellen Sie eine einzelne Aufgabe mit mehreren Anwendungen 'Aktivitäten (Lauchmode Problem)
  • Kein Fehler "Nur der ursprüngliche Thread, der eine Ansichtshierarchie erstellt hat, kann seine Ansichten berühren", wenn die Ansicht ohne Verzögerung aktualisiert wird
  • Ich dachte über die Serialisierung des Objekts zu einem ByteArrayOutputStream, base64 codieren das und schreibe es in eine SharedPreferences-Datei als String. Oder ist das zu weit weg

    AKTUALISIEREN

    Vielleicht ist die serialize-to-string-Idee nicht so schlimm, denn es scheint gut gut zu funktionieren. Hier ist was ich jetzt mache:

    public static String objectToString(Serializable object) { ByteArrayOutputStream out = new ByteArrayOutputStream(); try { new ObjectOutputStream(out).writeObject(object); byte[] data = out.toByteArray(); out.close(); out = new ByteArrayOutputStream(); Base64OutputStream b64 = new Base64OutputStream(out); b64.write(data); b64.close(); out.close(); return new String(out.toByteArray()); } catch (IOException e) { e.printStackTrace(); } return null; } public static Object stringToObject(String encodedObject) { try { return new ObjectInputStream(new Base64InputStream( new ByteArrayInputStream(encodedObject.getBytes()))).readObject(); } catch (Exception e) { e.printStackTrace(); } return null; } 

    In onDestroy () kann ich dann einfach die Base64-Zeichenfolge in eine Präferenzdatei schreiben, wo es sicher ist, bis ich es beim nächsten Aktivitätsstart wieder gelesen habe. Es ist viel schneller als ich erwartet hatte und es sei denn, deine Bohnen tragen riesige Mengen an Daten, es funktioniert ziemlich gut. Und noch besser, du musst kein DB-Schema pflegen.

    Dennoch bin ich neugierig, wie andere das tun.

  • Android - Finden Sie heraus, welche Stunde des Tages ist es
  • SDK-Manager startet nicht Windows 7 64-Bit?
  • SetPreviewDisplay vs setPreviewTexture
  • SVG to Android Shape
  • Button in ViewPager blättern zu einer bestimmten Seite
  • Wie ermöglicht man einen Mikrofoneingang im Android Emulator
  • 2 Solutions collect form web for “Wie behalte ich ein komplexes Objekt in der Aktivität Neustart?”

    Ich suche nach einem Weg, der nicht mit der Erstellung einer Datenbank und dem Schreiben des Objekts zu dem (meistens seit a) Android-DB-API ist schrecklich und b) da Datenbanken machen Anwendungs-Updates ein Albtraum, weil es keine anständige Unterstützung für die Anwendung von Migrationen ).

    Android API ist eigentlich ziemlich vernünftig, vor allem, weil es eine dünne Wrapper über die SQLite-API, und die SQLite-API ist ziemlich vernünftig für eine eingebettete Datenbank. Darüber hinaus bietet Android Unterstützung für Schema-Upgrades auf App-Upgrades, über SQLiteOpenHelper .

    Es ist viel schneller als ich erwartet hatte und es sei denn, deine Bohnen tragen riesige Mengen an Daten, es funktioniert ziemlich gut.

    Ich habe von vielen weiteren Entwicklern gehört, die von der Serialisierung wegschreien, als ich von Leuten gehört habe, die langfristigen Erfolg damit haben. Gerade in den vergangenen Tagen, hier auf SO #android, hatte ich einen Austausch mit jemandem, der verzweifelt versucht, die Serialisierung aus seiner App durch die Wurzeln zu zerreißen.

    Und noch besser, du musst kein DB-Schema pflegen.

    Oh ja, das tust du Was denkst du, wenn du deine Bewerbung aktualisierst und deine Klasse modifiziert hast? Die Buchhaltung zu machen, um herauszufinden, wie man alte Versionen der Klasse von einer neuen Version einer Klasse deserialisieren kann, ist eine Aufgabe und ist einer der Gründe, warum Entwickler die Serialisierung aufgeben. Vergessen Sie auch nicht, dass die Serialisierung nicht transaktional ist, während SQLite ist.

    Ich war auch auf der Suche nach einem schönen Ansatz von un / Marshalling alle Bohnen oder Aktivität Staaten. Wir alle wissen, wie viel Aktivität onStoreInstanceState () und onRestoreInstanceState () ist ein Schmerz.

    Meine Aktivitäten speichern ihre Zustände einfach in onPause () und stellen sie in onCreate () Lifecycle Hooks über direkte Objekt Serialisierung wieder her.

    Serialisierung über eine String wie Sie es tun, ist natürlich möglich, aber weniger geeignet für große Daten und verursacht viel Overhead. Darüber hinaus sind Vorlieben eigentlich da, um Vorlieben zu speichern, nicht Daten ๐Ÿ™‚ Leider ist das Paket / Paket, was wir für diesen Zweck verwenden könnten, nicht empfehlen, auf persistenten Speicher zu speichern.

    Also, was übrig bleibt, ist ein einfaches Objekt Serialisierung – zum Glück Android android SDK hat die Umsetzung der ObjectInputStream und ObjectOutputStream Klassen mit allen Nachteilen und Vorteile – wie wir auch in einer Nicht-Android-Java-Welt, eine einfache:

     ObjectOutputStream.writeObject(yourPojo) 

    Würde die Magie für uns machen (erinnere dich daran, die Serializable Marker-Schnittstelle zu implementieren)

    Außerdem können Sie in folgenden APIs eines Context – ContextWrapper – Activity suchen, die sehr nützlich sind, um lokale Daten (wie Bilder) etc zu cachen:

     .getCacheDir() .getDir() .openFileInput() .openFileOutput() 

    Glückliches Hacken ๐Ÿ™‚

    Das Android ist ein Google Android Fan-Website, Alles รผber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.