【问题标题】:Is Reading / Writing Preferences An Expensive Operation?读/写偏好是一项昂贵的操作吗?
【发布时间】:2013-03-19 05:07:06
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: android io preferences changelistener


    【解决方案1】:

    坦率地说,我在 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
            }
        }
    }
    

    【讨论】:

    • 太好了,我以后会这样做。 :)
    【解决方案2】:

    您可以使用 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 操作的数量。

    【讨论】:

    • 我正在考虑做那种事情!
    猜你喜欢
    • 1970-01-01
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2021-12-12
    • 2010-09-23
    • 2021-10-06
    • 2017-09-26
    • 1970-01-01
    相关资源
    最近更新 更多