2014-11-14 9 views
1

В настоящее время у меня есть служба, которая загружает настройки при запуске, сохраняет их как поля, а затем регистрирует OnSharedPreferenceChangeListener для обновления полей при изменении предпочтений. В настоящее время мой код выглядит следующим образом:Избегайте дублирования кода в 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. Есть ли способ изменить это, чтобы код для загрузки предпочтений нужно было написать только один раз?

+0

хороший вопрос, делаю так же глупо)) – Mixaz

+0

Не понимаю, как это можно улучшить. Может быть создан объект-оболочка для настроек, инкапсулирующих значения по умолчанию, наиболее раздражающие части кода. Другая часть в порядке, поскольку переменная инициализация и отслеживание изменений - это разные вещи. Класс wrapper может иметь такие методы, как getPreferenceAKey(), getPreferenceBKey() и т. Д. – Mixaz

ответ

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 сервера, повторно соединялись с сервером. Таким образом, это более или менее не имеет значения, если я их сброшу.

Надеюсь, это поможет.

+0

Хм, это работает, если значения связаны друг с другом, но что, если я хочу загружать каждое предпочтение отдельно? Они могут быть изменены из разных мест, и я не хочу перезагружать все настройки, когда только один из них изменился. –

+0

Я перечитал ваш код выше, и мне было интересно, почему вы не используете настройки напрямую? Если вы не начнете никаких действий, вызванных изменением предпочтений, вы можете использовать функции 'preference.get *()', не сохраняя их в свойствах в первую очередь. –