Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/227.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 读/写首选项是一项昂贵的操作吗?_Android_Io_Preferences_Changelistener - Fatal编程技术网

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

我正想做那种事!太好了,我以后会这么做的。:)