2010-11-29 6 views
4

Ich habe eine große Zeichenfolge, die JSON-Feed darstellt. Meine App lädt diesen Feed vom Remote-Webdienst herunter.Was ist der beste Weg, um mit JSON-Objekt umzugehen?

Fragen:

1) Sobald ich JSON-Feed herunterladen, wo soll ich es lagern? Momentan speichere ich es in App Preferences und es funktioniert gut. Ich bin nur interessiert, wenn es einen Grund gibt, das nicht zu tun, oder wenn es bessere/schnellere Optionen gibt, wie Interner Speicher oder etwas anderes?

2) Wenn ich bin Daten in meiner Tätigkeit aus diesem Feed zu zeigen, ich etwas wie folgt aus:

JSONObject jsonObj = new JSONObject(json_string); 
JSONArray jsonArr = jsonObj.getJSONArray("root"); 
for (int m = 0; m < jsonArr.length(); m++) { 
    .... 
} 

Das Problem ist, die erste Zeile, die JSON-Feed parst ist eine Art teuer. Bei meiner derzeitigen Größe (das könnte in Zukunft wachsen) braucht es vielleicht eine halbe Sekunde, um fertig zu werden, nicht viel, aber immer noch ein Problem. Zum Beispiel klicke ich auf die Schaltfläche, um die Aktivität anzurufen (um Daten anzuzeigen) und diese Pause von 1/2 Sekunde ist spürbar und nicht gut.

Um diese Pause zu vermeiden, sollte ich JSON wahrscheinlich sofort analysieren, nachdem der Feed heruntergeladen wurde. Dann Frage ist, wo soll ich JSON-Objekt geparst halten?

i) Ich kann kein JSON-Objekt in den Einstellungen speichern, da dort nur primitive Daten gespeichert werden können.

ii) Sollte ich bei jedem Start meiner App ein Parsing durchführen und meine analysierten JSON-Objekte (ich habe mehr davon) global (auf Anwendungsebene) machen, damit ich von allen meinen Aktivitäten darauf zugreifen kann?

iii) Oder, glaube ich, wäre meine dritte Option, JSON-Objekte statisch zu deklarieren, so dass sie leicht von anderen Aktivitäten aus zugänglich sind?

Was ist der beste Weg, dies zu tun?

THX.

Antwort

1

Müssen Sie es speichern? Wenn Sie es einmal von einer Webseite herunterladen und das ist alles was Sie brauchen, ist es in Ordnung, es in freigegebenen Einstellungen zu speichern. Wenn Sie es viel brauchen, warum es sogar speichern? Sie könnten es auch im Cache-Verzeichnis speichern

+0

Ich muss es speichern, da ich es nicht jedes Mal laden möchte, wenn meine App startet. Wie gesagt, ich speichere es als String. Ich würde gerne in der Lage sein, es als JSON-Objekt zu speichern, um Zeit zu sparen, die ich für die Analyse meiner JSON-Zeichenfolge benötige. – bobetko

+0

Wenn das JSON-Objekt nicht so gespeichert werden kann, wie es ist (so dass ich es aus einer meiner Aktivitäten heraus aufrufen kann), ist dies die beste Möglichkeit, das JSON-Objekt in allen Anwendungen verfügbar zu machen. – bobetko

+0

Die Zeit, die zum Analysieren eines JSON-Objekts benötigt wird, ist trivial. Wie denkst du, könntest du es als Objekt speichern? Es muss serialisiert werden. Serialisierung in JSON ist vollkommen gültig. – Falmarri

1

Es klingt, als ob Sie die SQLite-Datenbank verwenden sollten, um die Werte zu speichern, die Sie aus dem JSON extrahieren. Dies sollte Ihnen beim Einstieg helfen: http://developer.android.com/guide/topics/data/data-storage.html#db

Alle Ihre Aktivitäten innerhalb Ihrer Anwendung können dann die Datenbank nach den Daten abfragen. Wenn Sie ein ListView zum Anzeigen der Informationen verwenden, können Sie CursorAdapter verwenden, um die Liste einfach aufzufüllen.

Man könnte sogar ein Content Provider teilt diese Informationen mit anderen Anwendungen

+1

Danke Elevine. In meiner vorherigen Anwendung (meine erste) habe ich diesen Ansatz verwendet. Ich würde Feeds analysieren, sie in der SQlite-Datenbank speichern und dann DB-Daten verwenden, um meine Steuerelemente zu füllen. Es war ein bisschen mehr Arbeit, aber alles lief reibungslos. Nach einem Gespräch mit einem Freund von mir, einem iPhone-Programmierer, sagte er mir, dass diese DB-Schicht nicht notwendig ist, damit ich direkt mit dem Feed arbeiten kann. Also habe ich beschlossen, es bei meinem nächsten Projekt auszuprobieren und es selbst zu sehen. – bobetko

+1

Wenn Sie Ihre Daten nicht persistieren müssen, müssen Sie wahrscheinlich nicht den Datenbankansatz verwenden. – elevine

3

Wenn die Geschwindigkeit wirklich ein Problem, eine einfache Möglichkeit, deutlich zu beschleunigen Parsen (wie auch das Schreiben aus) JSON-Daten zu verwenden, wäre erstellen Jackson zum Analysieren von JSON-Daten. Im Vergleich zur org.json-Bibliothek (mit der das Android-SDK ausgeliefert wird) ist es mindestens 3 bis 5 Mal schneller, wenn Sie nur Maps oder Listen analysieren möchten (http://www.cowtowncoder.com/blog/archives/2009/02/ entry_204.html). Aber wenn Sie es an Java-Objekte binden können, ist es noch schneller und benötigt auch weniger Speicher.

Wenn Sie JSON-Daten speichern möchten, werden diese normalerweise nur als Dateien oder als BLOBs in Datenbanken serialisiert. Aber wenn Sie es wirklich nicht müssen, ist es besser, nur Java-Objekte zu verwenden, die aus JSON-Daten erstellt wurden.

+0

Danke. Also, wenn ich JSON-Objekt serialisieren und Daten in Datei speichern, und später muss ich es laden und deserialize, denken Sie, dass schneller als das Abrufen von String aus den Einstellungen (JSON-Feed) und JSONObject jsonObj = new JSONObject (json_string) ausführen wird? – bobetko

+0

Ich bin nicht vertraut mit Einstellungen Schnittstelle; Alles was ich sage ist, dass der von JSONObject verwendete Parser langsam ist und es schnellere Alternativen gibt. Dies unabhängig davon, wie JSON gespeichert wird (Bytes im Speicher, String, Netzwerk lesen). – StaxMan