AndroidX.Preference onPreferenceChange с добавлением в очередь Retrofit2 - PullRequest
0 голосов
/ 04 февраля 2020

У меня есть ListPreference, и я хочу добавить OnPreferenceChangeListener(), где, когда пользователь сделал выбор, он пытается выполнить REST вызов, используя Retrofit2. Если вызов успешен, ничего не происходит, но если он не удается, я хочу, чтобы он вернулся к предыдущему значению.

Мне известно, что интерфейс, реализующий onPrefernceChange(), возвращает логическое значение true, чтобы сохранить настройки, и false, чтобы не сохранять.


        private static final String LIST_PREFERENCE_KEY= "listPreference";

        private ListPreference mListPreference;

        @Override
        public void onCreatePreferences(Bundle savedInstanceState, String rootKey) {
            setPreferencesFromResource(R.xml.root_preferences, rootKey);
            mListPreference= (ListPreference) findPreference(LIST_PREFERENCE_KEY);
            assert mListPreference != null;
            mListPreference.setOnPreferenceChangeListener(new RestOnPreferenceChangeListener());
        }


        public class RestOnPreferenceChangeListener implements Preference.OnPreferenceChangeListener {

            private boolean callHasFailed = false;

            @Override
            public boolean onPreferenceChange(Preference preference, Object newValue) {
                ListPreference listPreference = (ListPreference) preference;
                changePreferenceRestCall(new RetrofitBody("id", listPreference.getValue(), newValue.toString()));
                return true;
            }


            private void changePreferenceRestCall(RetrofitBody retrofitBody) {
                if (!callHasFailed) {
                    Retrofit retrofit = new Retrofit.Builder()
                            .baseUrl("http://10.0.2.2:8080")
                            .addConverterFactory(JacksonConverterFactory.create())
                            .build();

                    CustomRetrofitService retrofitService = retrofit.create(CustomRetrofitService .class);
                    Call<Boolean> responseCall = retrofitService
                            .doSomething(retrofitBody);

                    responseCall.enqueue(new Callback<Boolean>() {
                        @Override
                        public void onResponse(Call<Boolean> call, Response<Boolean> response) {
                            System.out.println("response = " + response);
                        }

                        @Override
                        public void onFailure(Call<Boolean> call, Throwable t) {
                            callHasFailed = true;
                            mListPreference.setValue(oldRetrofitBodyWithPreviousValue);
                            callHasFailed = false;
                        }
                    });
                }
            }

        }
    }```

I receive this error: 
`A WebView method was called on thread 'FinalizerDaemon'. All WebView methods must be called on the same thread.` 

I understand why I get it, but I can't come up with a solution that satisfies what I want. 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...