2013-03-19 9 views
6

Ich habe eine Voreinstellung, die steuert, ob meine App einen Ton abspielt, wenn der Benutzer auf eine Schaltfläche klickt (was oft vorkommt, denke an einen Taschenrechner). Jedes Mal, klickt der Benutzer auf die Schaltfläche die folgende Methode aufgerufen wird:Ist Lesen/Schreiben eine teure Operation?

private void playButtonClickSound() { 
    SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(parentActivity); 
    boolean sounds = sharedPrefs.getBoolean("prefSounds", false); 
    if (sounds) { 
     // blah 
    } 
} 

Ich dachte, dass Lesepräferenzen könnte ein teuer Betrieb sein (ähnlich einer E/A-Operation, weil Präferenzen beibehalten werden) und dass, da die Der Benutzer klickt so oft auf Schaltflächen, dass es möglicherweise eine schlechte Idee ist, dies auf diese Weise zu tun.

In der Regel ist es eine schlechte Idee, Einstellungen häufig zu lesen/schreiben? Wenn ja, könnte es einen anderen Weg geben, wie zum Beispiel die Registrierung eines Präferenz-Change-Listeners, um benachrichtigt zu werden, wenn sich eine Präferenz ändert?

Antwort

5

Ehrlich gesagt mache ich alle meine auf dem UI-Thread, ob ich sollte oder nicht, und ich habe nie eine geringe Menge an Zögern selbst auf langsameren Geräten bemerkt. Es ist verdammt schnell. Das heißt, es ist I/O, so dass es asynchron wäre sicherlich keine schlechte Sache. Wenn Sie bei Schreibvorgängen auf API 9 und höher abzielen, können Sie apply() anstelle von commit() verwenden, was asynchron für Sie funktioniert.

Was Ihre Frage nach einer Präferenz ändern Zuhörer, ja können Sie tun das auch:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context); 
prefs.registerOnSharedPreferenceChangeListener(new OnSharedPreferenceChangeListener() { 
    @Override 
    public void onSharedPreferenceChanged(SharedPreferences preferences, String key) { 
     if("my_preference_key".equals(key) { 
      //Handle it here 
     } 
    } 
} 
+1

Toll, so werde ich es in Zukunft machen. :) –

0

Sie können im Speichercache mit Java-Referenzen implementieren. Sie können folgende Schritte ausführen:

public boolean getMySound(){ 
    boolean sound=getFromMemory(); 
    if (!sound){//if not available 
      //lets load from shared preferences 
    sound=getSoundFromPreference(); 
     // update memory cache so next time i will load from memory 
    addToMemory(sound); 
    } 
    return sound; 
} 

Dadurch wird die Anzahl der E/A-Vorgänge minimiert.

+0

Ich dachte an, dass die genaue Art der Sache zu tun! –