Android 读/写首选项是一项昂贵的操作吗?
我有一个偏好控制我的应用程序是否在用户点击按钮时播放声音(这是经常做的,想想计算器)。每次用户单击按钮时,将调用以下方法:Android 读/写首选项是一项昂贵的操作吗?,android,io,preferences,changelistener,Android,Io,Preferences,Changelistener,我有一个偏好控制我的应用程序是否在用户点击按钮时播放声音(这是经常做的,想想计算器)。每次用户单击按钮时,将调用以下方法: private void playButtonClickSound() { SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(parentActivity); boolean sounds = sharedPrefs.getBoolean("prefSo
private void playButtonClickSound() {
SharedPreferences sharedPrefs = PreferenceManager.getDefaultSharedPreferences(parentActivity);
boolean sounds = sharedPrefs.getBoolean("prefSounds", false);
if (sounds) {
// blah
}
}
我认为读取首选项可能是一项昂贵的操作(类似于I/O操作,因为首选项是持久化的),而且由于用户经常单击按钮,因此这样做可能不是一个好主意
通常,频繁地读/写首选项是个坏主意吗?如果是这样,是否还有其他方法,例如注册首选项更改侦听器,以便在首选项更改时获得通知?您可以使用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操作的数量 坦白地说,我所有的工作都是在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
}
}
}
我正想做那种事!太好了,我以后会这么做的。:)