Ich erinnere mich an diesen Beitrag, in dem einige Probleme bei der Verwendung von Singletons aufgezählt wurden und einige Beispiele für Android-Anwendungen mit Singleton-Muster gesehen wurden. Ich frage mich, ob es eine gute Idee ist, Singletons anstelle einzelner Instanzen zu verwenden, die über den globalen Anwendungsstatus gemeinsam genutzt werden (Unterklasse android.os.Application und deren Erhalt) durch context.getApplication ()).
Welche Vor- und Nachteile hätten beide Mechanismen?
Um ehrlich zu sein, erwarte ich die gleiche Antwort in diesem Beitrag Singleton-Muster mit Webanwendung, keine gute Idee! aber auf Android angewendet. Hab ich recht? Was ist sonst in DalvikVM anders?
EDIT: Ich hätte gerne Meinungen zu verschiedenen Aspekten:
- Synchronisation
- Wiederverwendbarkeit
- Testen
quelle
Ich kann Singletons nur empfehlen. Wenn Sie einen Singleton haben, der einen Kontext benötigt, haben Sie:
Ich bevorzuge Singletons gegenüber Application, da dies dazu beiträgt, eine App viel organisierter und modularer zu gestalten. Anstatt einen Ort zu haben, an dem Ihr gesamter globaler Status in der App beibehalten werden muss, kann sich jedes einzelne Teil um sich selbst kümmern. Auch die Tatsache, dass Singletons (auf Anfrage) träge initialisiert werden, anstatt Sie auf den Weg zu führen, alle Initialisierungen in Application.onCreate () im Voraus durchzuführen, ist gut.
Es ist an sich nichts Falsches daran, Singletons zu verwenden. Verwenden Sie sie einfach richtig, wenn es Sinn macht. Das Android-Framework verfügt tatsächlich über viele davon, damit pro Prozess Caches mit geladenen Ressourcen und anderen derartigen Dingen verwaltet werden können.
Auch für einfache Anwendungen wird Multithreading bei Singletons nicht zum Problem, da standardmäßig alle Standardrückrufe an die App im Hauptthread des Prozesses gesendet werden, sodass kein Multithreading stattfindet, es sei denn, Sie führen es explizit über Threads oder ein implizit durch Veröffentlichung eines Inhaltsanbieters oder Dienstes IBinder für andere Prozesse.
Denken Sie nur darüber nach, was Sie tun. :) :)
quelle
Von: Entwickler> Referenz - Anwendung
quelle
Die Anwendung ist nicht die gleiche wie beim Singleton. Die Gründe sind:
quelle
Ich hatte das gleiche Problem: Singleton oder eine Unterklasse android.os.Application erstellen?
Zuerst habe ich es mit dem Singleton versucht, aber meine App ruft irgendwann den Browser an
und das Problem ist, dass, wenn das Mobilteil nicht über genügend Speicher verfügt, die meisten Ihrer Klassen (sogar Singletons) bereinigt werden, um Speicherplatz zu erhalten. Bei der Rückkehr vom Browser zu meiner App stürzte es jedes Mal ab.
Lösung: Fügen Sie die erforderlichen Daten in eine Unterklasse der Anwendungsklasse ein.
quelle
Betrachten Sie beide gleichzeitig:
Darüber hinaus schlage ich vor, dass Sie Ihren Kontext erweitern, um nicht nur den Zugriff auf Singleton-Objekte, sondern auch einige Funktionen einzuschließen, auf die global zugegriffen werden muss, z. B. context.logOffUser (), context.readSavedData () usw. Vermutlich wird der Kontext in umbenannt Fassade würde dann Sinn machen.
quelle
Sie sind eigentlich gleich. Es gibt einen Unterschied, den ich sehen kann. Mit der Application-Klasse können Sie Ihre Variablen in Application.onCreate () initialisieren und in Application.onTerminate () zerstören. Bei Singleton müssen Sie sich darauf verlassen, dass die VM die Statik initialisiert und zerstört.
quelle
Meine 2 Cent:
Ich habe festgestellt, dass einige Singleton- / statische Felder zurückgesetzt wurden, als meine Aktivität zerstört wurde. Ich habe dies auf einigen Low-End-2.3-Geräten bemerkt.
Mein Fall war sehr einfach: Ich habe nur eine private Datei "init_done" und eine statische Methode "init", die ich von activity.onCreate () aufgerufen habe. Ich stelle fest, dass sich die Methode init bei einer Neuerstellung der Aktivität erneut selbst ausführte.
Obwohl ich meine Bestätigung nicht beweisen kann, kann dies damit zusammenhängen, WENN der Singleton / die Klasse zuerst erstellt / verwendet wurde. Wenn die Aktivität zerstört / recycelt wird, scheinen alle Klassen, auf die sich nur diese Aktivität bezieht, ebenfalls recycelt zu werden.
Ich habe meine Singleton-Instanz in eine Unterklasse von Application verschoben. Ich greife auf sie aus der Anwendungsinstanz zu. und bemerkte das Problem seitdem nicht mehr.
Ich hoffe das kann jemandem helfen.
quelle
Aus dem sprichwörtlichen Pferdemund ...
Bei der Entwicklung Ihrer App müssen Sie möglicherweise Daten, Kontext oder Dienste global für Ihre App freigeben. Wenn Ihre App beispielsweise Sitzungsdaten enthält, z. B. den aktuell angemeldeten Benutzer, möchten Sie diese Informationen wahrscheinlich verfügbar machen. In Android besteht das Muster zur Lösung dieses Problems darin, dass Ihre android.app.Application-Instanz alle globalen Daten besitzt und Ihre Anwendungsinstanz dann als Singleton mit statischen Zugriffsmethoden für die verschiedenen Daten und Dienste behandelt.
Wenn Sie eine Android-App schreiben, haben Sie garantiert nur eine Instanz der android.app.Application-Klasse. Daher ist es sicher (und vom Google Android-Team empfohlen), sie als Singleton zu behandeln. Das heißt, Sie können Ihrer Anwendungsimplementierung sicher eine statische getInstance () -Methode hinzufügen. Wie so:
quelle
Meine Aktivität ruft finish () auf (was nicht sofort beendet wird, aber irgendwann erledigt wird) und ruft Google Street Viewer auf. Wenn ich es auf Eclipse debugge, wird meine Verbindung zur App unterbrochen, wenn Street Viewer aufgerufen wird. Ich verstehe, dass die (gesamte) Anwendung geschlossen wird, um Speicher freizugeben (da eine einzelne Aktivität, die beendet wird, dieses Verhalten nicht verursachen sollte). . Trotzdem kann ich den Status in einem Bundle über onSaveInstanceState () speichern und in der onCreate () -Methode der nächsten Aktivität im Stapel wiederherstellen. Entweder durch Verwendung eines statischen Singletons oder einer Unterklassenanwendung kann die Anwendung geschlossen werden und den Status verlieren (es sei denn, ich speichere sie in einem Bundle). Aus meiner Erfahrung sind sie in Bezug auf die Erhaltung des Staates gleich. Ich habe festgestellt, dass die Verbindung in Android 4.1.2 und 4.2.2 unterbrochen ist, jedoch nicht in 4.0.7 oder 3.2.4.
quelle