2012-09-06 9 views
5

Ich bin eine Android-App zu schreiben, die den aktuellen Zustand eines Activity oder Fragment in eine JSON-Datei zu exportieren Lage ist, das folgende gemeinsame Format hat:Android/Java gemeinsame json Import-Schnittstelle

{ 
    "data": { 
    "result": { 
     <content depends on specific class> 
    }, 
    "input": { 
     <content depends on specific class> 
    } 
    }, 
    "identifier": <identifier depends on specific class>, 
    "version": 1 
} 

Das bedeutet, dass Activities/Fragments, die die Möglichkeit zum Export haben, die markierten Inhalte ausfüllen, indem sie eine Schnittstelle implementieren, die ich "Exportfähig" nannte, und die allgemeine Exportfunktion ruft die in der Schnittstelle definierten Methoden auf. Dies ist eine direkte Vorwärtslösung, die ziemlich gut funktioniert.

So weit so gut. Jetzt möchte ich die umgekehrte Richtung machen. Ich möchte eine Datei laden und die entsprechenden Activity/Fragment abhängig vom Inhalt der Kennung aufrufen.

Das Lesen des Inhalts des "Eingangs" und des "Ergebnisses" soll durch eine Methode des Activity/Fragment selbst erfolgen.

Leider ist mir nicht klar, wie ich dieses Problem elegant lösen kann. Was ist der beste Weg, das zu tun? Die Lösung soll so abstrakt wie möglich sein, damit sie leicht erweitert werden kann.

+0

Was ist mit ['SharedPreferences'] (http://developer.android.com/guide/topics/data/data-storage.html#pref) zu tun, um' Activity'-Status zu speichern und wiederherzustellen? Dies überlebt auch Neustarts von Anwendungen/Geräten. Wenn Sie nur einen kurzlebigen Zustand (Gerätedrehung, Hintergrund) beibehalten möchten, können Sie das integrierte ['savedInstanceState'' Bundle'-System] (http://developer.android.com/training/basics/activity- Lebenszyklus/Neuerstellung.html). –

Antwort

0

Es könnte so viele verschiedene Antworten darauf geben. Google hat eine Bibliothek namens GSON, die automatisch JSON-Daten von und zu Java-Klassen lesen und schreiben kann. Wenn Sie keine Bibliothek verwenden möchten, können Sie Java-Reflektion verwenden.

0

JSONObject js = neues JSONObject ("data");

JSON-Objekt jSObject1 = js.getJSONObject ("Ergebnis"); JSONObject jSObject2 = js.getJSONObject ("input"); und so weiter ich hoffe, ich verstehe Ihr Problem

0

Eine if-else die einfachste Lösung wäre, aber wenn es nicht abstrakt genug für Sie ist, verwenden Sie die Abstract Factory pattern.

Erstellen Sie eine ExportableFactory Schnittstelle, die eine Methode zum Erstellen einer Exportable und Implementierungen dieser Schnittstelle für Activity und Fragment definiert. Erstellen Sie dann einen Map<String, ExportableFactory>, der die möglichen Werte von identifier dem richtigen Hersteller zuordnet. Dann rufen:

Exportable exportable = factoryMap.get(identifier).createExportable(data); 

auf diese Weise, wenn Sie eine dritte Implementierung von Exportable hinzufügen möchten, müssen Sie nur die entsprechende Implementierung von ExportableFactory erstellen müssen und es auf der Karte hinzufügen, ohne die anrufende Funktion zu ändern.