我有一个奇怪的问题,其中 SharedPreferences 在返回应用程序时没有更新。这是场景:
我有两个使用相同共享偏好的项目。项目 1 和项目 2。它们是独立但相关的应用程序。它们使用相同的密钥进行签名,并使用 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();
完成后,我通过调用返回 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));
}
问题是 Project1 中的值未更新。我可以根据最后的日志判断该文件甚至没有生成映射。但是,我可以验证 xml 是否正在更新。如果我强制停止应用程序然后重新启动它,所有映射都在 Project1 中。所有的值都是正确的。但是,当用户离开 Project2 时,我需要更新它们。我觉得我在这里缺少一些东西,但无法发现它。
我能找到的关于这个主题的唯一事情是:
SharedPreferences.Editor 在初始提交后未更新
这些没有帮助,因为我已经在这样做了。
我在两个清单中都设置了 WRITE_EXTERNAL_STORAGE。文件名是相同的(否则当我重新进入应用程序时将无法读取文件)。
编辑:
我应该注意到,我确实尝试过这样做,editor.commit()
而不是editor.apply()
像我认为的那样面临比赛条件。问题仍然存在。我在想,出于某种原因,使用 Project1 中对 SharedPreference 的旧引用而不是新引用,即使我每次都延迟加载它。
编辑2:
好的,进一步测试看看 id 发生了什么。我决定尝试相反的方向。
在 Project1 我做:
Float testFloat (float) Math.random();
Log.d("TEST_FLOAT", "Project1: TEST_FLOAT = " + testFloat);
prefs.edit().putFloat("TEST_FLOAT", testFloat).commit();
在 Project2 我做:
Log.d("TEST_FLOAT", "Project2: TEST_FLOAT = " + prefs.getFloat("TEST_FLOAT", 0.0f));
然后我像这样在两者之间来回切换: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
换句话说,它正在读取和写入同一个文件。但是,它保留了它在项目中首次打开时的映射。即使我关闭了项目,映射仍然存在,直到应用程序被强制停止。