当另一个线程中的语句失败时,还原android偏好的值

问题描述 投票:1回答:1

我在我的应用程序中有一些设置,我允许用户使用带有PreferenceScreens的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函数,这样我就不会得到无限递归)?

android multithreading sharedpreferences revert
1个回答
2
投票

使用OnPreferenceClickListener而不是OnPreferenceChangeListener来监听设置字段上的用户点击,然后相应地发出rpc请求。如果必须更新该值(在服务器发生故障的情况下),您可以更改设置而不触发单击侦听器并具有无限循环。

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

© www.soinside.com 2019 - 2024. All rights reserved.