SharedPreferences-Anwendungskontext vs. Aktivitätskontext

Lesezeit: 3 Minuten

Benutzer-Avatar
d1rk

Ich verwende mehrere SharedPreferences, um Daten in meiner App zu speichern. Einige Einstellungen werden in vielen Aktivitäten verwendet.

Ich weiß, dass die SharedPreferences intern durch eine Karte für schnellen Lesezugriff gesichert und auf die SD-Karte geschrieben werden, wenn Einstellungen geändert werden.

Ich frage mich, welcher Weg besser ist, wenn viele Aktivitäten auf eine gemeinsame Einstellung zugreifen:

  1. Instanziieren Sie es in jeder Aktivität mithilfe des Aktivitätskontexts.
  2. Instanziieren Sie es in jeder Aktivität, aber unter Verwendung des Anwendungskontexts.
  3. Legen Sie es zB in die Application-Klasse und instanziieren Sie es nur einmal dort, ähnlich einem Singleton.

Wenn ich 1. Lösung verwende, gibt es ein gemeinsames Präferenzobjekt für jede Aktivität? Und wird die interne Karte der Sharedpreference zerstört, wenn die Aktivität zerstört wird?

Wenn ich 2. Lösung verwende, wird es nur eine Instanz geben, obwohl ich getSharedPreferences in jeder Aktivität aufrufe? Und bleibt die interne Karte im Speicher, solange die Anwendung aktiv ist?

Hoffentlich weiß jemand, wie Android es intern handhabt.

  • Ich würde Wahl drei empfehlen, Sie können von all Ihren Aktivitäten aus darauf zugreifen und müssen nur einmal lesen.

    – Joel

    19. Juli 2012 um 18:38 Uhr

Es lohnt sich, die zu überprüfen Quellen die zeigen, dass a Context Beispiel (sei es eine Activity oder ein Application Instanz) teilen sich dieselbe statische Karte HashMap<String, SharedPreferencesImpl>.

Wann immer Sie also eine Instanz von anfordern SharedPreferences unter dem gleichen Namen via Context.getSharedPreferences(name, mode) Sie erhalten die gleiche Instanz, da zuerst überprüft wird, ob die Karte bereits enthalten ist SharedPreferences Instanz für einen Schlüssel (der der übergebene Name ist). Einmal SharedPreferences Instanz geladen wird, wird sie nicht erneut geladen, sondern stattdessen von der Karte genommen.

Es ist also eigentlich egal, welchen Weg Sie gehen, wichtig ist, denselben Namen zu verwenden, um dieselben Einstellungen aus verschiedenen Teilen der Anwendung zu erhalten. Das Erstellen eines einzigen “Zugangspunkts” für die Einstellungen könnte jedoch von Vorteil sein. Es könnte also ein Singleton-Wrapper über den instanziierten Prefs sein Application.onCreate().

SharedPreferences werden intern von Android als Singletons verwaltet. Sie können so viele Instanzen erhalten, wie Sie möchten, indem Sie Folgendes verwenden:

context.getSharedPreferences(name, mode);

solange Sie das gleiche verwenden Namedu bekommst immer das gleiche Beispiel. Daher gibt es keine Nebenläufigkeitsprobleme.

Benutzer-Avatar
AAnkit

Ich verwende lieber a Einzelling Klasse bevorzugt, Initialisieren Sie die Präferenz einmal durch den Anwendungskontext. Getter- und Setter(get/put)-Methoden erstellen, um Daten hinzuzufügen, zu aktualisieren und zu löschen.

Auf diese Weise wird eine Instanz einmal erstellt und kann besser lesbar und wiederverwendbar sein.

  • Es ist auch gut, wenn eine Anwendung von einer HTTP-Anfrage zurückkehrt. In diesem Fall ist möglicherweise kein Kontext (Aktivität) vorhanden, sodass context.getSharedPreferences zu NPE führt. Bei Verwendung eines Singletons passiert dies nicht.

    – CoolMind

    25. Januar 2017 um 16:33 Uhr

Benutzer-Avatar
Fahim Schych

Wir können eine Preferences Singleton-Klasse erstellen und eine Instanz dieser Klasse in der erweiterten Anwendungsklasse mit applicationContext erstellen, sodass wir dieses Objekt in der gesamten Anwendung verwenden können. Ich habe eine sharedPreferenceManager-Klasse erstellt und ein statisches Objekt erstellt, indem ich applicationContext bereitgestellt habe. Jetzt kann auf statische Objekte überall im Projekt zugegriffen werden

public class App extends Application {
    public static App myApp;
    public static PreferenceManagerSignlton preferenceManagerSingleton;
    @Override
    public void onCreate() {
        super.onCreate();
        myApp = this;
        preferenceManagerSingleton = new PreferenceManagerSignlton();
        preferenceSingleton.initialize(getApplicationContext());
    }
}

Zugriff auf statisches Objekt im Projekt

App.myapp.PreferenceManagerSignltonz.getSavedValue();

1194060cookie-checkSharedPreferences-Anwendungskontext vs. Aktivitätskontext

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

Privacy policy