Android SharedPreferences在多个进程之间不一致

时间:2013-10-04 15:02:20

标签: android sharedpreferences

我在努力让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 :< / p>

**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),物理首选项文件也会正确更改,但在前台线程中它仍然是真的。

在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的任何其他后续调用之间传递相当长的时间。

1 个答案:

答案 0 :(得分:1)

我找到了解决方案。

似乎SharedPreferences不是Process-Safe类,如果在调用getSharedPreferences时设置了一个标志,它可以用于多个进程:

MODE_MULTI_PROCESS

这解决了这个问题。