[英]SharedPreferences in Android not getting recently updated values across multiple running processes
[英]Android SharedPreferences not consistent between multiple processes
我在嘗試使SharedPreferences工作時遇到麻煩。
這是代碼:
/**
* Sets the software in synchronizing status.
* @param synchronizing Boolean
*/
public void setSynchronizing(boolean synchronizing) {
if(D) Log.d(TAG, "Called: setSynchronizing("+synchronizing+")");
SharedPreferences preferences = mContext.getSharedPreferences(SharedPrefsConstants.PREFERENCES, 0);
SharedPreferences.Editor editor = preferences.edit();
editor.putBoolean(SharedPrefsConstants.SYNCHRONIZING, synchronizing);
boolean result = editor.commit();
if(!result)
Log.w(TAG, "Cannot store the preference.");
if(!synchronizing)
BroadcastUtils.stopSynchronizing(mContext);
}
/**
* Returns whether the software is synchronizing.
* @return True if synchronization is happening.
*/
public boolean isSynchronizing() {
SharedPreferences preferences = mContext.getSharedPreferences(SharedPrefsConstants.PREFERENCES, 0);
boolean synchronizing = preferences.getBoolean(SharedPrefsConstants.SYNCHRONIZING, false);
if(D) Log.d(TAG, "Called: isSynchronizing Returning: "+synchronizing);
return synchronizing;
}
這是logcat的輸出,請注意,我在應用程序中使用了兩個單獨的進程,我將它們分別稱為app和app:bg :
**app** D/StorageManager﹕ Called: setSynchronizing(true)
**app** D/StorageManager﹕ Called: setSynchronizing(true)
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true
**app:bg** D/StorageManager﹕ Called: setSynchronizing(false)
**app** D/StorageManager﹕ Called: isSynchronizing Returning: true
StorageManager是一個單例實例,但其中有兩個實例,每個實例一個。
即使從后台線程調用setSynchronizing(false),物理首選項文件也已正確更改,但是在前台線程中它仍然為true。
您可以看到在setSynchronizing將變量設置為false之后,isSynchronizing方法返回true。 問題是: 為什么會這樣? 這是我第一次在此軟件中使用SharedPreferences,因此無法在其他任何地方進行設置。
當isSynchronizing仍返回TRUE時,這是手機中存儲的首選項文件:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="synchronizing" value="false" />
</map>
我唯一能想到的是,SharedPreferences在內存中擁有某種緩存,如果您可以確認這一點,則可以通過某種方式強制更新SharedPreference?
我還必須說,在將變量設置為false以及從前台線程對isSynchronizing進行的任何其他后續調用之間,要花費大量的時間。
我找到了解決方案。
似乎SharedPreferences不是一個進程安全的類,如果在調用getSharedPreferences時設置一個標志,它可以與多個進程一起使用:
MODE_MULTI_PROCESS
這樣就解決了問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.