我不确定我现在是否真的需要这个,但如果我的应用程序扩展,我可以看到这种可能性。我基本上有一个围绕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()