6

我有一个偏好,可以控制我的应用程序是否在用户单击按钮时播放声音(这很常见,想想计算器)。每次用户单击按钮时,都会调用以下方法:

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

我在想读取首选项可能是一项昂贵的操作(类似于 I/O 操作,因为首选项是持久的)并且由于用户经常单击按钮,因此这样做可能不是一个好主意。

一般来说,经常读/写首选项是一个坏主意吗?如果是这样,是否还有另一种方法,例如注册偏好更改侦听器以在偏好更改时收到通知?

4

2 回答 2

5

坦率地说,我在 UI 线程上完成了所有工作,无论我是否应该这样做,而且即使在速度较慢的设备上,我也从未注意到有轻微的犹豫。这该死的快。也就是说,它I/O,所以异步执行肯定不是一件坏事。对于写入,如果您的目标是 API 9 及更高版本,您可以使用它apply()来代替commit()为您异步执行它。

至于您关于偏好更改侦听器的问题,是的,您也可以这样做:

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 回答