Возврат значения предпочтения Android в случае сбоя оператора в другом потоке - PullRequest
0 голосов
/ 05 сентября 2018

В моем приложении есть настройки, которые я позволяю пользователю манипулировать, используя PreferenceScreen с Preference s. Однако я хочу сохранить настройки на сервере, чтобы настройки могли сохраняться на нескольких устройствах. У меня есть следующий код, который позволяет мне сделать это:

private void updateSettingOnPrefChange(final Preference pref, final Setting setting) {
    pref.setOnPreferenceChangeListener(new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, final Object newValue) {
            try {
                setting.update(newValue, new Callback<Boolean>() {
                    @Override
                    public void call(Boolean succeeded) {
                        if (!succeeded) {
                            Toast.makeText(getActivity(), "Setting failed to update. Please try again.", Toast.LENGTH_LONG).show();
                            //here I need to revert the value of the Preference without again calling the onChangeListener
                        }
                    }
                }, getActivity());
            } catch (Exception ex) {
                if (BuildConfig.DEBUG)
                    ex.printStackTrace();
                Toast.makeText(getActivity(), "Setting failed to update. Please try again.", Toast.LENGTH_LONG).show();
                return false;
            }
            return true;
        }
    });
}

Как видно из кода, запрос выполняется в другом потоке с использованием пользовательского класса Callback для очистки на основе результата вызова. Проблема в том, что код уже вернет true в главном потоке.

Как я могу вернуть значение Preference в функции обратного вызова (желательно без вызова функции onPrefChangeListener, чтобы я не получал бесконечную рекурсию)?

1 Ответ

0 голосов
/ 05 сентября 2018

Используйте OnPreferenceClickListener вместо OnPreferenceChangeListener для прослушивания пользовательских нажатий на поле настроек, а затем соответственно сделайте запрос rpc. Если вам необходимо обновить значение (в случае сбоя сервера), вы можете изменить настройку, не запуская прослушиватель щелчков и имея бесконечный цикл.

https://developer.android.com/reference/android/preference/Preference.html#setOnPreferenceClickListener(android.preference.Preference.OnPreferenceClickListener)

...