# Was passiert wenn man die App (gewaltsam) schließt



## xyt4n (1. Sep 2015)

Hallo,

ich programmiere zur Zeit meine erste professionelle App. Nunja professionell in so weit das ich es releasen möchte und eine gute Qualität hat.

Während dem programmieren ist mir was aufgefallen. Was passiert mit meinen Werten/Daten, wenn die App abstürzt, gewaltsam beendet wird, Handy ausgeht, usw...

Hier ein Code Beispiel wo es kritisch werden könnte. Es gibt bestimmt unzählige weitere:

```
setID++;
//TODO write actual value to stored file
set.id = String.valueOf(setID);
```

Wenn die App nach der 2. Zeile beendet wird, so wird der Wert nicht zugewiesen. Das führt zu folgendem Effekt:

Set1 mit id = 1
Set2 mit id = 0 (da nichts hinzugefügt wurde)
Set3 mit id = 3
Es könnten weitere beliebige Effekte passieren, z.B. dass Set3 die id = 2 bekommt usw.

Die grundlegende Funktion meiner App ist, dass Werte/Dateien gespeichert werden. Man kann sich das wie eine Notizapp oder Kalorienzähler vorstellen. Da diese Werte/Dateien über Monate und Jahre hinweg gespeichert werden, ist es sehr ärgerlich, wenn man sich von den Daten irgendwann verabschieden muss.

Nun meine Frage ist es, wie verhindert man so etwas, oder muss man das überhaupt verhindern? 
Ist Android so intelligent programmiert, dass solche Fehlerbehandlung selten notwendig oder sogar gar nicht? 

Das hier ist noch ein seichter Fall, es kann in anderen Fällen zu korrupten Dateien führen. Ich kann mir nicht vorstellen das man solche Fälle ignorieren darf, aber es wird sehr viele kritische Bereiche geben.

Also, wenn es Android nicht absichert, gibt es wichtige Methoden oder Design Patterns die mir helfen können?

Grüße
Xyt4n


----------



## Tobse (1. Sep 2015)

Für Android: Der Activity Lifecycle wird dir weiterhelfen:







Wenn dem Handy der Strom ausgeht fährt es rechtzeitig kontrolliert herunter, ergo werden auch onPause() onStop() und onDestroy() richtig aufgerufen.

Wenn du für ältere Handys programmierst läuft das fast immer in Form von Applets oder JavaFX. Auch dort gibt es Methoden für Erstellen, Start, Pause und Stopp die vom OS so zuverlässig wie möglich aufgerufen werden.

Es gibt allerdings zwei Situationen, in welchen es kritisch werden kann:

Der User führt einen Reset durch (bei vielen Android Handys Anschalter + Lautstärke Hoch für 4 Sekunden halten) oder das Handy wird schlagartig dermaßen beschädigt, dass essentielle Teile des Mainboards kaputt gehen.

Im ersteren Fall führt der User es selbst herbei und sollte sich des Risikos bewusst sein. Im letzteren Fall sind ein paar verlorene/falsche Daten wohl die geringere Sorge des Nutzers.

Generell gilt: organisiere deine Daten so, dass die Daten, welche du schon persistent gespeichert hast, nicht durch das fehlerhafte schreiben neuer Daten kaputt gehen.
Organisiere deine Daten ausserdem in möglichst kleinen Einheiten und speichere die allerwichtigsten Infos (Index-Listen, referenz-IDs, u.s.w) redundant.


----------



## buggy84 (10. Sep 2015)

Grundsätzlich ist es hier notwendig, sich über die Aufstellung der Daten Gedanken zu machen. Im Beispiel deiner sets. Es gibt Schlüssel, die eindeutig sind, oder besser gesagt: einmalig. Eine einfache Zahl als id wäre mir zu unsicher. Je nachdem wie Du deine daten speicherst und was Du damit machst, kann es hier zu schweren Fehler kommen.
Du hast das sicher nur zur Anschauung angebracht, ich möchte aber trotzdem meine Gedankengänge dazu loswerden, um Dir die Wichtigkeit einer Grundstruktur näher zu bringen:
Eine eindeutige (stimmt nicht ganz, aber 2-mal die gleiche id wäre extremer Zufall, hier kommt es drauf an wieviel sets du anlegen wirst und ob es zwischen vielen Nutzern identische id´s geben dürfte) id wäre zum Beispiel hier ein UUID Generator https://www.uuidgenerator.net/
Sowas würde ich z.B. als id verwenden. Dann, wenn die id absolut wichtig ist, würde ich zum erstellen eines sets dringend die id als Parameter übergeben. Also nicht erst sets erstellen, dann id's zuweisen. So habe ich zumindest Gewissheit, dass ich kein set ohne id habe. Natürlich wäre es auch sinnvoll, vorher zu checken ob meine generierte id nicht doch zufällig schon vergeben ist.
Wenn Daten abgespeichert werden, dann ist es natürlich gut wenn beim Laden der Daten auch nochml die integrität der Daten überprüft werden.
Wie schon beschrieben wurde, der Lifecycle ist bei Dartenkritischen Andwendungen deine Bibel. Dennoch: Datenverlust bei unerwarteten Abbrüchen, wie von Tobse beschrieben, gibt es nicht erst seit Android.
Alle Eventualitäten wirst Du nicht abfangen können, aber Du wirst mit wachsender Erfahrung auch besser. Und dann kannst du auch genau eingrenzen, welche Daten wirklich relevant sind, und welche durchaus mal kaputt gehen können.


----------

