我在尝试让 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。
您可以看到 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 的任何其他后续调用之间经过了相当长的时间。