2

我在尝试让 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。

您可以看到 isSynchronizing 方法在 setSynchronizing 将该变量设置为 false 后返回 true。问题是:为什么会发生这种情况?这是我第一次在这个软件中使用 SharedPreferences,所以它不能在其他任何地方设置。

这是存储在手机中的首选项文件,当 isSynchronizing 仍然返回 TRUE 时:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<boolean name="synchronizing" value="false" />
</map>

我唯一能想到的是 SharedPreferences 在内存中保存了某种缓存,如果您可以确认这一点,是否有某种方法可以强制更新 SharedPreference?

我还必须说,在设置为 false 的变量和从前台线程对 isSynchronizing 的任何其他后续调用之间经过了相当长的时间。

4

1 回答 1

1

我找到了解决方案。

看起来 SharedPreferences 不是一个进程安全类,如果您在调用 getSharedPreferences 时设置一个标志,它可以与多个进程一起使用:

MODE_MULTI_PROCESS

这解决了问题。

于 2013-10-08T09:20:07.643 回答