Statische Daten, die in Singleton gespeichert werden, sind manchmal Null, wenn sie vom Hintergrund zur App zurückkehren

8

Ich verwende ein klassisches Singleton-Muster, um Daten zu speichern, die ich von webServices in meiner ursprünglichen Aktivität (Splash-Aktivität) bekomme, und dann in der gesamten Anwendung darauf zuzugreifen.

Ich habe eine Splash-Aktivität, die zu MainActivity führt. Dies ist die gleitende Menüaktivität mit dem darin enthaltenen Fragment. Das anfängliche Fragment ist ein Fragment, das das Support-Map-Fragment enthält.

mein Problem ist mit den Daten in der Singleton gespeichert, manchmal, wenn die App in den Hintergrund geht (drücken nach Hause und Umzug in eine andere App) und dann gehen apps und wählen Sie meine Anwendung, die Daten des Singleton ist null, die meine app abstürzt .

Ich habe Stunden damit verbracht, zu prüfen, ob mein Singleton so geschrieben ist, wie es sollte und was die möglichen Gründe dafür sind, dass statische Daten null werden, wenn ich sie nicht selbst zu Null mache.

Nach meiner Suche fand ich eine großartige und einfache Erklärung, die erklärt, wann / warum statische Daten null werden können - Android statischen Objektlebenszyklus @ Samuh Antwort und ich zitiere

"Wenn Sie also eine Android-Anwendung erstellen und eine statische Variable initialisieren, bleibt sie in der JVM, bis eine der folgenden Situationen eintritt: 1. Die Klasse wird entladen 2. Die JVM schaltet sich ab 3. der Prozess stirbt "

Über # 1 und # 2 - Ich weiß nicht wirklich wann diese auftreten.

In Bezug auf # 3 - das ist völlig in Ordnung, als ob der Benutzer auf meine App von "letzten Anwendungen" klicken würde, wird dies die Launcher-Aktivität in meinem Fall "Splash-Aktivität" aufrufen und dies wird die Daten (aktuell) von Servern und Speichere es wieder in meinem Singleton - perfekt! Das ist genau das, was in meinen anderen Anwendungen passiert. Der Unterschied ist, dass ich kein gleitendes Menü und keine Fragmente verwende, sondern nur Aktivitäten. Hier wird in meinem Fall die Rückkehr aus dem Hintergrund nicht die Launcher-Aktivität aufrufen, die der "Startbildschirm" ist, sondern die MainActivity (die Hauptschiebe-Menüaktivität) zusammen mit dem Anfangsfragment aufrufen, und wenn ich versuche, auf Daten von meinem Singleton alle Daten zuzugreifen innerhalb ist es null, das Singleton selbst ist nicht null, weil ich bei der onCreate () des Fragments getInstance () verwende.Ich glaube, dass dies bedeutet, dass das Singleton verloren gegangen ist und jetzt neu erstellt wurde, ohne Daten darin, also wenn der Prozess ist getötet Warum bin ich nicht zur Launcher-Aktivität zurückgekehrt?

Hoffe jemand kann helfen, danke im Voraus.

Meine Singleton-Klasse:

%Vor%     
EviatarS 21.11.2013, 12:28
quelle

1 Antwort

2

Ihr Singleton wird vom System getötet, im Allgemeinen, weil es Speicher benötigt oder weil der Prozess vielleicht zu alt ist.

Was ich Ihnen vorschlage ist:

-Speichern Sie Daten von Ihrem Singleton, zum Beispiel in gemeinsamen Einstellungen, so dass es bei Bedarf einfach neu erstellt werden kann. Es funktioniert im Allgemeinen gut -Speichern Sie Ihre Variablen, indem Sie OnSaveInstanceState in Ihrer Aktivität überschreiben und beim erneuten Erstellen wiederherstellen.

    
Aerilys 21.11.2013 12:34
quelle