簡體   English   中英

Android SharedPreferences在多個進程之間不一致

[英]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的輸出,請注意,我在應用程序中使用了兩個單獨的進程,我將它們分別稱為appapp: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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM