SharedPreferences未更新

Dee*_*eeV 11 android sharedpreferences

我有一个奇怪的问题,在返回应用程序时没有更新SharedPreferences.这是场景:

我有两个使用相同共享首选项的项目.Project1和Project2.它们是独立但相关的应用程序.它们使用相同的密钥签名,并使用sharedUserId来共享信息.

Project1打开Project2.

Project2检索SharedPreferences文件并通过此方法写入它:

Context prefsContext = c.createPackageContext(packageNameOfProject1, Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences prefs = prefsContext.getSharedPreferences(fileName, Context.MODE_PRIVATE);
SharedPreferences.editor editor = prefs.edit();
editor.putBool("bool1", value1);
editor.putBool("bool2", value2);
...
editor.putBool("boolN", valueN);
editor.apply();
Run Code Online (Sandbox Code Playgroud)

完成后,我通过调用返回Project1 finish().

然后Project1读取数据,如下所示:

SharedPreferences prefs = getSharedPreferences(getPreferencesFileName(), Context.MODE_PRIVATE);
Boolean value1 = prefs.getBoolean(fileName, false);
Boolean value2 = prefs.getBoolean(fileName, false);
...
Boolean valueN = prefs.getBoolean(fileName, false);
Map<String, ?> mappings = prefs.getAll();
Set<String> keys = mappings.keySet();
for(String key : keys) {
  log.d(TAG, "_____");
  log.d(TAG, "Key = " + key);
  log.d(TAG, "Value = " + mappings.get(key));
}
Run Code Online (Sandbox Code Playgroud)

问题是Project1中的值未更新.我可以根据最后的日志告诉文件甚至不生成映射.但是,我可以验证xml是否正在更新.如果我强制停止应用程序然后重新启动它,Project1中的所有映射都在那里.所有的值都是正确的.但是,当用户离开Project2时,我需要更新它们.我觉得这里有一些我不知道但却找不到的东西.

我在这个问题上唯一能找到的是:

初始提交后SharedPreferences.Editor未更新

SharedPreferences值未更新

这些没有帮助,因为我已经这样做了.

我在两个清单中都设置了WRITE_EXTERNAL_STORAGE.fileName是相同的(否则当我重新进入应用程序时我将无法读取该文件).

编辑:

我应该注意到我确实尝试过,editor.commit()而不是editor.apply()因为我认为我面临着竞争条件.问题仍然存在.我想由于某种原因,使用Project1中的SharedPreference的旧引用而不是新的引用,即使我每次都懒得加载它.

EDIT2:

好的,进一步测试看看id是怎么回事.我决定尝试相反的方向.

在Project1中我做:

Float testFloat (float) Math.random();
Log.d("TEST_FLOAT", "Project1: TEST_FLOAT = " + testFloat);
prefs.edit().putFloat("TEST_FLOAT", testFloat).commit();
Run Code Online (Sandbox Code Playgroud)

在Project2中我做:

Log.d("TEST_FLOAT", "Project2: TEST_FLOAT = " + prefs.getFloat("TEST_FLOAT", 0.0f));
Run Code Online (Sandbox Code Playgroud)

然后我在两者之间来回走动:Project1->Project2->Project1->Project2->Project1->Project2这里是logcat结果:

Project1: TEST_FLOAT = 0.30341884
Project2: TEST_FLOAT = 0.30341884
Project1: TEST_FLOAT = 0.89398974
Project2: TEST_FLOAT = 0.30341884
Project1: TEST_FLOAT = 0.81929415
Project2: TEST_FLOAT = 0.30341884
Run Code Online (Sandbox Code Playgroud)

换句话说,它正在读取和写入同一个文件.但是,它保留了在项目中首次打开它时所具有的映射.即使我关闭了项目,映射仍然存在,直到应用程序被强制停止.

Dee*_*eeV 19

最终答案:

更换

getSharedPreferences(fileName, Context.MODE_PRIVATE);

getSharedPreferences(fileName, Context.MODE_MULTI_PROCESS);

根据文件:

Context.MODE_MULTI_PROCESS

SharedPreferences loading flag:设置后,即使已在此进程中加载​​了共享首选项实例,也会检查磁盘上的文件是否有修改.在应用程序具有多个进程的情况下,有时需要此行为,所有进程都写入相同的SharedPreferences文件.但是,通常在进程之间存在更好的通信形式.

这是Gingerbread(Android 2.3)之前和之前的遗留(但没有记录)行为,并且在定位此类版本时隐含了这个标志.对于针对大于Android 2.3(Gingerbread)的SDK版本的应用程序,如果需要,必须明确设置此标志.

我知道这有一个简单的疏忽.

  • 致今天遇到此问题的任何人。这是 2012 年的答案,但今天不好。`MODE_MULTI_PROCESS` 早已被弃用。多进程访问必须通过另一种方式来完成。https://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS (2认同)