У меня есть 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.