Могут ли SharedPreferences Editor метод apply () и unregisterOnSharedPreferenceChangeListener () конфликтовать друг с другом? - PullRequest
0 голосов
/ 27 мая 2020

У меня есть сомнения относительно использования общих предпочтений, поскольку я новичок в этом. У меня есть два действия: MainActivity и SettingsActivity. Я могу изменить SharedPreferences в обоих действиях и перемещаться между ними, но, в частности, я беспокоюсь об изменении настроек в MainActivity.

Когда я меняю настройки в MainActivity, я хочу сохранить их для следующего раза. они нужны в любом случае, а именно: в случае, если пользователь закрывает приложение, переходит к другому действию или сохраняет приложение в фоновом режиме, чтобы открыть другое приложение (onPause () будет запущен).

What Я пытаюсь сделать это:

  1. У меня есть PopupMenu.OnMenuItemClickListener, который в зависимости от выбранного пункта меню изменяет значение предпочтения, а затем выполняет метод apply () редактора SharedPreferences .

  2. Из-за этого запускается 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, часть документации гласит:

  • Вам не нужно беспокоиться о жизненных циклах Android компонентов * и их взаимодействие с apply() * записью на диск. Фреймворк обеспечивает полную * запись на диск из apply() перед переключением * состояний.

Итак, я предполагаю, что проблем быть не должно, или мне следует внести какие-либо изменения? например, использовать редактор строго в методе onPause () или не полагаться на слушателя для обновления пользовательского интерфейса в этом случае?

...