阅读/写作偏好是一项昂贵的操作吗?

时间:2013-03-19 05:07:07

标签: android io preferences changelistener

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

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

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

一般来说,经常读取/写入首选项是个坏主意吗?如果是这样,可能还有其他方式,例如注册首选项更改侦听器以在首选项更改时收到通知吗?

2 个答案:

答案 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操作次数。