Mit der Veröffentlichung von Gingerbread habe ich mit einigen der neuen APIs experimentiert, darunter StrictMode .
Mir ist aufgefallen, dass eine der Warnungen für ist getSharedPreferences()
.
Dies ist die Warnung:
StrictMode policy violation; ~duration=1949 ms: android.os.StrictMode$StrictModeDiskReadViolation: policy=23 violation=2
und es wird für einen getSharedPreferences()
Aufruf gegeben, der auf dem UI-Thread getätigt wird.
Sollten SharedPreferences
Zugriff und Änderungen wirklich über den UI-Thread vorgenommen werden?
android
sharedpreferences
android-strictmode
CottonBallPaws
quelle
quelle
Antworten:
Ich bin froh, dass du schon damit spielst!
Einige Dinge zu beachten: (in fauler Kugelform)
In Bezug auf das Laden, obwohl ...
Nach dem Laden sind SharedPreferences Singletons und werden prozessweit zwischengespeichert. Sie möchten es also so früh wie möglich laden, damit Sie es im Speicher haben, bevor Sie es benötigen. (Vorausgesetzt, es ist klein, wie es sein sollte, wenn Sie SharedPreferences verwenden, eine einfache XML-Datei ...) Sie möchten es in Zukunft nicht mehr bemängeln, wenn ein Benutzer auf eine Schaltfläche klickt.
Wenn Sie jedoch context.getSharedPreferences (...) aufrufen, wird in der XML-Sicherungsdatei angezeigt, ob sie geändert wurde. Daher sollten Sie diese Statistiken bei UI-Ereignissen trotzdem vermeiden. Eine Statistik sollte normalerweise schnell sein (und häufig zwischengespeichert werden), aber Yaffs haben nicht viel Parallelität (und viele Android-Geräte laufen auf Yaffs ... Droid, Nexus One usw.). Wenn Sie also die Festplatte meiden Vermeiden Sie es, hinter anderen laufenden oder ausstehenden Festplattenvorgängen hängen zu bleiben.
Daher möchten Sie wahrscheinlich die SharedPreferences während Ihres onCreate () laden und dieselbe Instanz erneut verwenden, um den Status zu vermeiden.
Wenn Sie Ihre Einstellungen während onCreate () ohnehin nicht benötigen, verzögert diese Ladezeit den Start Ihrer App unnötig. Daher ist es im Allgemeinen besser, eine FutureTask <SharedPreferences> -Unterklasse zu haben, die einen neuen Thread für .set startet () Der Wert der FutureTask-Unterklassen. Suchen Sie dann einfach nach dem Mitglied Ihres FutureTask <SharedPreferences>, wann immer Sie es benötigen, und .get (). Ich habe vor, dies hinter den Kulissen von Honeycomb transparent zu machen. Ich werde versuchen, einen Beispielcode zu veröffentlichen, der Best Practices in diesem Bereich zeigt.
Überprüfen Sie den Blog der Android-Entwickler auf bevorstehende Beiträge zu StrictMode-Themen in den kommenden Wochen.
quelle
Der Zugriff auf die freigegebenen Einstellungen kann einige Zeit dauern, da sie aus dem Flash-Speicher gelesen werden. Liest du viel? Vielleicht könnten Sie dann ein anderes Format verwenden, z. B. eine SQLite-Datenbank.
Korrigieren Sie jedoch nicht alles, was Sie mit StrictMode finden. Oder um die Dokumentation zu zitieren:
quelle
Eine Subtilität zu Brads Antwort: Selbst wenn Sie die SharedPreferences in onCreate () laden, sollten Sie wahrscheinlich immer noch Werte im Hintergrundthread lesen, da getString () usw. blockieren, bis Sie die Einstellungen für gemeinsam genutzte Dateien in den Endspielen (in einem Hintergrundthread) lesen:
edit () blockiert ebenfalls auf die gleiche Weise, obwohl apply () im Vordergrund-Thread sicher zu sein scheint.
(Übrigens, es tut mir leid, das hier niederzulegen. Ich hätte dies als Kommentar zu Brads Antwort eingefügt, aber ich bin gerade beigetreten und habe nicht genug Ruf, um dies zu tun.)
quelle
Ich weiß, dass dies eine alte Frage ist, aber ich möchte meinen Ansatz teilen. Ich hatte lange Lesezeiten und verwendete eine Kombination aus gemeinsamen Einstellungen und der globalen Anwendungsklasse:
Anwendungsklasse:
LocalPreference:
MainActivity (Aktivität, die in Ihrer Anwendung zuerst aufgerufen wird):
Schritte erklärt:
HINWEIS: Überprüfen Sie IMMER, ob sich eine anwendungsweite Variable von NULL unterscheidet. Grund -> http://www.developerphil.com/dont-store-data-in-the-application-object/
Wenn ich null nicht aktiviert hätte, würde ich zulassen, dass ein Nullzeiger ausgelöst wird, wenn beispielsweise getMaxDistance () für das Filterobjekt aufgerufen wird (wenn das Anwendungsobjekt von Android aus dem Speicher gewischt wurde).
quelle