Statische Variablen in Android verwenden

Lesezeit: 7 Minuten

Statische Variablen in Android verwenden
michael

Ist die Verwendung statischer Variablen in Android eine empfohlene Vorgehensweise? B. die Implementierung von a Singleton-Muster in JavaNormalerweise mache ich:

private static A the_instance;
public static A getInstance() {
    if (the_instance == null) {
       the_instance = new A();
    }
    return the_instance;
}

Wann wird dies außerdem von der Android-JVM bereinigt?

  • Ich glaube, Sie benötigen eine Sperre für die Synchronisierung für Ihre Singleton-Klasse, andernfalls werden Sie im Multi-Thread-Szenario mehrere Objekte im Heap-Speicher haben.

    – Shanwu

    11. Februar 17 um 13:59 Uhr


static Felder sind angehängt Class Instanz als Ganzes, die wiederum an die angeschlossen ist ClassLoader was die Klasse geladen hat. the_instance entladen werden würde, wenn die gesamte ClassLoader wird zurückgefordert. Ich bin mir zu 90 % sicher, dass dies passiert, wenn Android die App zerstört (nicht, wenn sie in den Hintergrund geht oder pausiert, sondern vollständig heruntergefahren wird).

Betrachten Sie es also als lebendig, solange Ihre App läuft. Ist Singleton eine gute Idee? Menschen haben unterschiedliche Ansichten. Ich selbst finde es in Ordnung, wenn es richtig eingesetzt wird. Ich glaube nicht, dass sich die Antwort auf Android stark ändert. Die Speichernutzung ist nicht das eigentliche Problem; Wenn Sie eine Menge Zeug in den Speicher laden müssen, ist das entweder ein Problem oder nicht, unabhängig davon, ob Sie die Daten in einem Singleton kapseln.

  • Bestätigt, wird es aufbewahrt, bis Ihr gesamter Prozess zerstört ist. Wenn Ihr Prozess wiederbelebt wird, wird Ihr Singleton wieder angezeigt!

    – Jess Wilson

    19. März 10 um 15:26 Uhr

  • Zu beachten ist, dass der Singleton neu erstellt wird, aber der ursprüngliche Zustand des Singletons nicht automatisch wiederhergestellt wird. Dies müsste manuell erfolgen.

    – Kevin Westwood

    23. Mai ’12 um 19:33 Uhr


  • @harshjv Singletons sind oft auch unveränderlich, in diesem Fall spielt es keine Rolle, ob Sie eine alte oder neue Kopie davon sehen. Aber wenn Ihr Singleton den Zustand beibehält, geht dieser Zustand verloren, wenn der Singleton zerstört wird. Es wird neu erstellt, jedoch mit dem standardmäßigen Anfangszustand.

    – Sean Owen

    15. Februar 15 um 10:07 Uhr

  • @harshjv, Sean Owen hat recht. Wenn der Prozess zerstört wird, wird der Singleton zerstört. Wenn der Prozess wiederbelebt wird, wird der Singleton automatisch neu erstellt. Alle Eigenschaften oder zugrunde liegenden privaten Elementvariablen des Singletons werden jedoch nicht automatisch wiederhergestellt. Sie müssen den Zustand des Objekts separat speichern und wiederherstellen.

    – Kevin Westwood

    16. Februar 15 um 23:04 Uhr


  • Wenn Ihr Code das Singleton so initialisiert, dass es einen Status wie Ihre Liste von Zeichenfolgen hat, dann hat es das natürlich jedes Mal, wenn es erstellt wird. Wenn Ihr Code diesen Status irgendwie ändert, z. B. zur Liste hinzugefügt, werden diese nicht neu erstellt. Dies ist dasselbe wie jedes andere Objekt in der JVM.

    – Sean Owen

    21. November 2020 um 15:09 Uhr

Ich denke, statische Variablen sind in Ordnung.

Das sagt das Android-Dokument:

http://developer.android.com/guide/appendix/faq/framework.html

Wie übertrage ich Daten zwischen Aktivitäten/Diensten innerhalb einer einzigen Anwendung?

Ein öffentliches statisches Feld/eine Methode

Eine alternative Möglichkeit, Daten über Aktivitäten/Dienste hinweg zugänglich zu machen, besteht darin, öffentliche statische Felder und/oder Methoden zu verwenden. Sie können von jeder anderen Klasse in Ihrer Anwendung aus auf diese statischen Felder zugreifen. Um ein Objekt freizugeben, legt die Aktivität, die Ihr Objekt erstellt, ein statisches Feld so fest, dass es auf dieses Objekt zeigt, und jede andere Aktivität, die dieses Objekt verwenden möchte, greift einfach auf dieses statische Feld zu.

  • Bindung, Callbacks/Listener, aber nicht statisch

    – Wolodymyr Lychonis

    29. Juni 12 um 21:07 Uhr

  • Haben Sie schon von Absichten gehört? Statische Felder sind schlechte Praxis, es neigt dazu, eng zu koppeln …

    – Anis LOUNIS

    23. August 15 um 16:40 Uhr

  • Könnt ihr mir bitte die richtige Lösung anbieten? Bei statischen Variablen habe ich ein Problem, wenn die App aus dem Hintergrund kommt oder viele Stunden geöffnet bleibt, stürzt sie ab. Mit Absicht ist es sehr schwer, Gegenstände zu passieren. Was ist also der richtige Weg, dies zu tun?

    – Sagar Panwala

    15. März 16 um 7:18 Uhr

  • @SagarPanwala versuchen Sie es mit Parcelables. Wenn Sie große Bitmaps haben, die einen großen Einfluss auf Ihren Speicher haben, versuchen Sie es mit einer geeigneten Bibliothek wie Picasso.

    – pcern

    19. August 16 um 9:09 Uhr

  • @SagarPanwala, können Sie weitere Einzelheiten zum Absturz angeben?

    – Sir Codealot

    17. März 17 um 23:18 Uhr

Im Gegensatz zu dem, was andere Leute sagen – es ist mehr als ok. Zugegeben, es hat eine gewisse Struktur. Im offiziellen Repo von googlesamples/android-architecture wird es unter todo-mvp-clean (Todo-App, die das MVP-Muster implementiert und den Clean-Architecture-Prinzipien folgt) verwendet. Schau dir das an Datei.

Was Sie sehen können, sind viele statische Methoden, die auf Singleton-Getter verweisen.

Moderne, weniger fehleranfällige und komfortable Alternative ist das Dagger DI-Framework.

Ich bin mir nicht sicher, ob ein solcher Ansatz für mobile Plattformen geeignet ist, auf denen Ihnen nur begrenzter Speicherplatz zur Verfügung steht. Ganz zu schweigen davon, dass die Anwendung auf einem Multitasking-fähigen Gerät ausgeführt wird.

Ich denke, dieser Ansatz kann Speicher vom Gerät beanspruchen, aber ich habe kein Dokument, das dies unterstützt. Vielleicht kann jemand, der gebildeter ist als ich, seine Gedanken teilen.

Statische Variablen in Android verwenden
Michael Aaron Safjan

Nein. Tu es nicht! Singleton ist ein Antipatern!. Verwenden Sie stattdessen Abhängigkeitsinjektion, sei es über ein Framework (z. B. via Dolch oder Roboguice) oder durch explizites Übergeben des instanziierten Objekts.

  • Denken Sie daran, dass das Android-Kernteam die Verwendung Ihres “Anti-Musters” befürwortet und dass Google Guice anscheinend etwa 800 KB JARs benötigt, was für eine mobile App schlecht ist.

    – CommonsWare

    19. März 10 um 12:27 Uhr

  • Guice ist großartig, aber für viele Anwendungen könnte es zu viel des Guten sein. Aber wenn Sie in Guice eintauchen wollen, werfen Sie einen Blick auf dieses schöne Projekt: code.google.com/p/roboguice

    – Jess Wilson

    19. März ’10 um 15:25 Uhr

  • Dependency-Injection-Zeug bringt Komplexität. Ich habe einige Entwickler gesehen, die Stunden damit verbrachten, herauszufinden, warum die falschen Objekte injiziert wurden. Singleton hat seine Werte!

    – yonexbat

    27. Oktober 13 um 10:39 Uhr

  • @yonexbat-Frameworks bringen Komplexität, aber man kann auch explizite Injektionen (ohne Framework) durchführen, was durchaus verständlich ist. Beide sind jedoch immer noch besser als die Verwendung eines Singletons, was den Code unflexibel und schwer zu testen macht. Siehe meinen Link für meine Begründung, warum Singleton ein Anti-Pattern ist und vermieden werden sollte.

    – Michael Aaron Safyan

    2. Oktober 15 um 8:27 Uhr

  • Ihre Ansicht eines Singleton-Musters hier macht die spröde Annahme, dass die Verwendung eines privaten Konstruktors eine einzelne Instanz verursacht. Das ist nicht der Fall. Die einzelne Instanz ist eine Richtlinie und nicht eine Sprache, die in der Implementierung der statischen Objektinstanz-Erzeugungsmethode erzwungen wird, z. B.: “getInstance”. Sie können diese Methode so viele Instanzen zurückgeben lassen, wie Sie möchten, oder nur eine, je nachdem, was Sie für die Klasse beabsichtigen.

    Benutzer1135300

    18. Juli 16 um 9:37 Uhr

  • Denken Sie daran, dass das Android-Kernteam die Verwendung Ihres “Anti-Musters” befürwortet und dass Google Guice anscheinend etwa 800 KB JARs benötigt, was für eine mobile App schlecht ist.

    – CommonsWare

    19. März 10 um 12:27 Uhr

  • Guice ist großartig, aber für viele Anwendungen könnte es zu viel des Guten sein. Aber wenn Sie in Guice eintauchen wollen, werfen Sie einen Blick auf dieses schöne Projekt: code.google.com/p/roboguice

    – Jess Wilson

    19. März ’10 um 15:25 Uhr

  • Dependency-Injection-Zeug bringt Komplexität. Ich habe einige Entwickler gesehen, die Stunden damit verbrachten, herauszufinden, warum die falschen Objekte injiziert wurden. Singleton hat seine Werte!

    – yonexbat

    27. Oktober 13 um 10:39 Uhr

  • @yonexbat-Frameworks bringen Komplexität, aber man kann auch explizite Injektionen (ohne Framework) durchführen, was durchaus verständlich ist. Beide sind jedoch immer noch besser als die Verwendung eines Singletons, was den Code unflexibel und schwer zu testen macht. Siehe meinen Link für meine Begründung, warum Singleton ein Anti-Pattern ist und vermieden werden sollte.

    – Michael Aaron Safyan

    2. Oktober 15 um 8:27 Uhr

  • Ihre Ansicht eines Singleton-Musters hier macht die spröde Annahme, dass die Verwendung eines privaten Konstruktors eine einzelne Instanz verursacht. Das ist nicht der Fall. Die einzelne Instanz ist eine Richtlinie und nicht eine Sprache, die in der Implementierung der statischen Objektinstanz-Erzeugungsmethode erzwungen wird, z. B.: “getInstance”. Sie können diese Methode so viele Instanzen zurückgeben lassen, wie Sie möchten, oder nur eine, je nachdem, was Sie für die Klasse beabsichtigen.

    Benutzer1135300

    18. Juli 16 um 9:37 Uhr

.

758160cookie-checkStatische Variablen in Android verwenden

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy