我有一个首选项,可以控制我的应用程序是否在用户单击按钮时播放声音(经常这样做,想到计算器)。每次用户单击按钮时,都会调用以下方法:
private void playButtonClickSound() {
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(parentActivity);
boolean sounds = sharedPrefs.getBoolean("prefSounds", false);
if (sounds) {
// blah
}
}
我认为阅读首选项可能是昂贵的操作(类似于I / O操作,因为首选项是持久的),并且由于用户经常点击按钮,因此可能不是一个好主意。这样做。
一般来说,经常读取/写入首选项是个坏主意吗?如果是这样,可能还有其他方式,例如注册首选项更改侦听器以在首选项更改时收到通知吗?
答案 0 :(得分: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
}
}
}
答案 1 :(得分:0)
您可以使用Java References在内存缓存中实现。您可以执行以下操作
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操作次数。