Android线程安全共享首选项



我不确定我现在是否真的需要这个,但如果我的应用程序扩展,我可以看到这种可能性。我基本上有一个围绕SharedPreferences的包装器,它从SharedPreferences中提取一些值,并将它们绑定到一个对象中。它还获取一个对象并使用它来更新首选项。我想让它线程安全,但我想尝试与信号灯。我的SharedPreferences包装器将从getSyncedPrefManager()获得对下面类的引用。然后它将调用aquireLock(),然后调用getPref(),完成它的工作,然后再调用releaseLock()。这看起来是可行的吗?还是我偏离了底线?

public class SyncedPreferenceManager {
    private final static SyncedPreferenceManager me =
                               new SyncedPreferenceManager();
    private SharedPreferences prefs;
    private static Semaphore mutex;
    public static SyncedPreferenceManager getSyncedPrefManager(){
        return me;
    }
    private SyncedPreferenceManager(){
        mutex = new Semaphore(1, true);
    }
    public SharedPreferences getPref(Context caller){
        if(prefs == null)
            prefs = PreferenceManager.getDefaultSharedPreferences(caller);
        return prefs;
    }
    public boolean aquireLock(){
        try {
            mutex.acquire();
        } catch (InterruptedException e) {
            return false;
        }
        return true;
    }
    public boolean releaseLock(){
        mutex.release();
        return true;
    }
}

您可能不喜欢这个答案。

你在这里使用的系统不对。SharedPreferences用于存储简单的首选项。仅仅因为你能做到这一点并不意味着你应该做到。你基本上是想把SharedPreferences变成一种不一样的东西。你可以加上所有这些花哨的锁,但它不会阻止以后有人从下面进来,不小心把它炸了。

如果您发现自己确实需要这些功能,您应该考虑直接使用sqlite。毫无疑问,您可以将同步添加到SharedPreferences中(我相信它在某种程度上是安全的,因为它已经使用事务/提交模型设计),但在我看来,这就像是重新发明轮子。

同步部分就足够了。通常,从首选项保存/加载值时没有性能问题(其中没有那么多值)
我也怀疑,你是否需要它。首选项通常在活动启动时加载或在暂停时保存(无论如何,这是一种线程化的歌曲,此时应用程序中只有一个活动正在启动或停止)

在我的应用程序中,首选项会被急切地阅读,只有在专用设置活动暂停时才会保存。在这种情况下,我不需要任何相互排斥。

我还开发了一个小型包装器库,它允许轻松地将偏好编组/解编组为对象属性:

https://github.com/ko5tik/andject

您可以始终在SharedPreferences.Editor中进行更改,并使用apply()以原子方式应用更改。

editor.apply()可从API第9级获得。

此处的文档:http://developer.android.com/reference/android/content/SharedPreferences.Editor.html#apply()

最新更新