避免OnSharedPreferenceChangeListener中的代码重复

时间:2014-11-14 08:34:56

标签: android sharedpreferences

我目前有一项服务在启动时加载首选项,将它们存储为字段,然后注册OnSharedPreferenceChangeListener以在修改首选项时更新字段。目前,我的代码如下所示:

public class MyService extends Service {
    private int _prefA;
    private boolean _prefB;
    private String _prefC;
    private boolean _prefD;
    private SharedPreferences _preferences;
    private SharedPreferences.OnSharedPreferenceChangeListener _prefChangeListener;

    @Override
    public void onCreate() {
        super.onCreate();
        _preferences = PreferenceManager.getDefaultSharedPreferences(this);
        _prefA = Integer.parseInt(_preferences.getString(PREF_A_KEY, "0"));
        _prefB = _preferences.getBoolean(PREF_B_KEY, false);
        _prefC = _preferences.getString(PREF_C_KEY, null);
        _prefD = _preferences.getBoolean(PREF_D_KEY, false);
        _prefChangeListener = new SharedPreferences.OnSharedPreferenceChangeListener() {
            @Override
            public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
                if (key.equals(PREF_A_KEY)) {
                    _prefA = Integer.parseInt(sharedPreferences.getString(key, "0"));
                } else if (key.equals(PREF_B_KEY)) {
                    _prefB = sharedPreferences.getBoolean(key, false);
                } else if (key.equals(PREF_C_KEY)) {
                    _prefC = sharedPreferences.getString(key, null);
                } else if (key.equals(PREF_D_KEY)) {
                    _prefD = sharedPreferences.getBoolean(key, false);
                }
            }
        };
        _preferences.registerOnSharedPreferenceChangeListener(_prefChangeListener);
    }
}

它按预期工作,但添加更多首选项变得乏味,因为我必须更新onCreate()OnSharedPreferenceChangeListener中的代码。有没有办法改变这个,以便加载首选项的代码只需要写一次?

1 个答案:

答案 0 :(得分:0)

这是相当理想的。但是,它减少了一点开销:

创建初始化函数:

private void initializeAccounts() {
    ...

    Resources res = getResources();
    SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);
    String User = preferences.getString(res.getString(R.string.username), null);
    String Pass = preferences.getString(res.getString(R.string.password), null);
    ...
}

然后对首选项进行分组:

@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
    if (getString(R.string.prefkey_password).equals(key) || getString(R.string.prefkey_username).equals(key)) {
        initializeAccounts();
    }
}

onCreate

@Override
public void onCreate(Bundle bundle) {
    super.onCreate(bundle);
    PreferenceManager.getDefaultSharedPreferences(this).registerOnSharedPreferenceChangeListener(this);

    initializeAccounts();
}

我将首选项组合在一起的原因是,当我编辑其中一个首选项时,其他首选项不会发生变化。但是,当我想要更改我的帐户密码时,我还需要其他首选项(如用户名或服务器URI)重新连接到服务器。所以,如果我重置它们或多或少并不重要。

希望这有帮助。