我在我的应用程序中有一些设置,我允许用户使用带有PreferenceScreen
s的Preference
进行操作。但是,我想将设置存储在服务器上,以便设置可以在多个设备上保留。我有以下代码可以让我这样做:
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函数,这样我就不会得到无限递归)?
使用OnPreferenceClickListener而不是OnPreferenceChangeListener来监听设置字段上的用户点击,然后相应地发出rpc请求。如果必须更新该值(在服务器发生故障的情况下),您可以更改设置而不触发单击侦听器并具有无限循环。