我在努力让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的任何其他后续调用之间传递相当长的时间。
答案 0 :(得分:1)
我找到了解决方案。
似乎SharedPreferences不是Process-Safe类,如果在调用getSharedPreferences时设置了一个标志,它可以用于多个进程:
MODE_MULTI_PROCESS
这解决了这个问题。