У меня есть сомнения относительно использования общих предпочтений, поскольку я новичок в этом. У меня есть два действия: MainActivity и SettingsActivity. Я могу изменить SharedPreferences в обоих действиях и перемещаться между ними, но, в частности, я беспокоюсь об изменении настроек в MainActivity.
Когда я меняю настройки в MainActivity, я хочу сохранить их для следующего раза. они нужны в любом случае, а именно: в случае, если пользователь закрывает приложение, переходит к другому действию или сохраняет приложение в фоновом режиме, чтобы открыть другое приложение (onPause () будет запущен).
What Я пытаюсь сделать это:
У меня есть PopupMenu.OnMenuItemClickListener, который в зависимости от выбранного пункта меню изменяет значение предпочтения, а затем выполняет метод apply () редактора SharedPreferences .
Из-за этого запускается onSharedPreferenceChanged, и он меняет пользовательский интерфейс в зависимости от измененного значения. Этот слушатель определен в onCreateView ();
Дело в том, что согласно документации здесь https://developer.android.com/guide/topics/ui/settings/use-saved-values рекомендуется отменить регистрацию и зарегистрировать указанный слушатель в любом действии. или Fragment, конкретно в методах onPause () и onResume () соответственно.
Это код одного из фрагментов MainActivity:
...
private SharedPreferences preferences;
private SharedPreferences.Editor editor;
...
@Override
public boolean onMenuItemClick(MenuItem item) {
if(item.getItemId()==R.id.item) {
editor = preferences.edit();
editor.putString(Mykey,"somevalue");
spEditor.apply(); //will fire the listener for this key changing
}
}
@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
...
listener = new SharedPreferences.OnSharedPreferenceChangeListener() {
@Override
public void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key) {
if (key.equals(Mykey) {
String value =sharedPreferences.getString(Mykey, "");
if (value.equals("somevalue"){
//update UI
}
}
}
};
preferences.registerOnSharedPreferenceChangeListener(listener);
}
@Override
public void onPause() {
super.onPause();
preferences.unregisterOnSharedPreferenceChangeListener(listener);
}
@Override
public void onResume() {
super.onResume();
preferences.registerOnSharedPreferenceChangeListener(listener);
}
Итак, есть ли шанс, что между выполнением apply () и запуском прослушивателя можно запустить onPause () и отменить регистрацию прослушивателя до того, как он будет запущен, что приведет к любой ошибке, такой как неправильное сохранение предпочтений или неправильное отображение пользовательского интерфейса?
Что касается метода apply () SharedPreferences.Editor, часть документации гласит:
Итак, я предполагаю, что проблем быть не должно, или мне следует внести какие-либо изменения? например, использовать редактор строго в методе onPause () или не полагаться на слушателя для обновления пользовательского интерфейса в этом случае?