6

ユーザーがボタンをクリックするたびにアプリがサウンドを再生するかどうかを制御する設定があります(これは非常に頻繁に行われます。電卓を考えてみてください)。ユーザーがボタンをクリックするたびに、次のメソッドが呼び出されます。

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

設定の読み取りはコストのかかる操作(設定が保持されるためI / O操作と同様)であり、ユーザーがボタンをクリックすることが多いため、この方法で行うのは悪い考えかもしれないと考えていました。

一般に、設定を頻繁に読み書きするのは悪い考えですか?もしそうなら、設定が変更されたときに通知を受け取るために設定変更リスナーを登録するなどの別の方法がありますか?

4

2 に答える 2

5

Frankly I do all of mine on the UI thread, whether or not I should, and I've never noticed a slight amount of hesitation even on slower devices. It's pretty damn quick. That said, it is I/O, so doing it asynchronously certainly wouldn't be a bad thing. For writes, if you're targeting API 9 and above, you can use apply() instead of commit() which does it asynchronously for you.

As for your question on a preference change listener, yes you can do that as well:

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
        }
    }
}
于 2013-03-19T05:25:04.823 に答える
0

Javaリファレンスを使用してメモリキャッシュに実装できます。あなたは以下を行うことができます

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;
}

これにより、I/O操作の数が最小限に抑えられます。

于 2013-03-19T05:22:00.013 に答える