Sicherer Download eines JSON und Speichern in der Datenbank – best practice?

  • Antworten:0
Boris Nicolai
  • Forum-Beiträge: 1

05.02.2014, 11:03:23 via Website

Schönen Guten Morgen,
ich suche nach der richtigen Strategie für folgende Aufgabe:
Ich habe eine ListView. Bei einem Klick auf ein ListView Item soll ein JSON heruntergeladen und dessen Inhalt in einer Datenbank gespeichert werden.
Wichtig ist: Wenn einmal der Prozess angestoßen wurde, darf er nicht wieder angestoßen werden können, damit keine doppelten Daten in der Datenbank sind.
Der User muß auch informiert werden, sobald der Prozess abgeschlossen ist und er sich die Inhalte aus dem Json in einer anderen Activity ansehen kann.
Ebenso muß er informiert werden, wenn ein Fehler aufgetreten ist und er manuell den Prozess neu starten soll.

Zur geplanten Umsetzung:
Beim Klick auf ein ListView Item speichere ich in den Shared Prefs, daß dieses Item in Bearbeitung ist (das Item wird "gelocked"). In der ListView stelle ich dies grafisch dar (onClick Listener raus nehmen, ausgrauen oder ähnliches).
Zum Download wird Volley verwendet (oder vielleicht Androids DownloadManager? Bin ich mir noch nicht schlüssig)
Die Datei wird heruntergeladen.
Bei einem Fehler erscheint eine entsprechende Fehlermeldung in der ListView mit der Möglichkeit, den Download neu zu starten. Der Lock in den Shared Prefs wird natürlich ebenfalls aufgehoben.
Sollte die Datei erfolgreich heruntergeladen worden sein wird ein IntentService gestartet.
Dieser extrahiert die Daten aus dem JSON und speichert via einer Transaktion alle Daten auf einmal in der Datenbank.
Bei einem Fehler geht eine Nachricht zurück an die LIstView (via broadcast receiver), ebenso im Falle des Erfolgs.

Passt soweit, oder?

Meine Kopfschmerzen beginnen ab diesem Zeitpunkt:
Was ist, wenn der User während dem Download die App schließt? Da es sich nicht um einen Service handelt, wäre der Lock in den Shared Prefs immer noch drinnen und er kann den Download auch nicht neu starten.
Was ist, wenn während des Downloads oder dem Speicher Prozess in die Datenbank das OS die App beendet oder den Speicher Prozess? Ich möchte zwar den Intent Service über einen separaten Prozess laufen lassen, aber der kann ja auch vom OS gestoppt werden.
Kann während dem Speichern in die Datenbank etwas passieren, obwohl alle Daten, die zu speichern sind, durch eine einzige Transaktion gespeichert werden sollen?
Ich kann zwar den Service auf NON_STICKY setzen, so daß im Falle eines Reboots der Service wieder angestoßen wird – aber löst das die Problematik?

Jetzt, wo ich das schreibe, kommt mir noch eine weitere Variante: Ich stoße nicht erst den download aus der App heraus an und dann den Service, sondern aus dem Service heraus den Download.
Aber kann ich dann sicher gehen, daß der Service nur einmal läuft, im Falle eines Fehlers wieder vollständig durchläuft und vor allem der Lock in den Shared Prefs wieder freigegeben wird? Oder soll der Lock nach 30 Sekunden automatisch entfernt werden?

Ich hoffe, ich habe mein Anliegen verständlich beschrieben, hoffe auf Feedback und schicke einen schönen Gruß in das Forum

Antworten