我遇到一个奇怪的问题,即在返回应用程序后,SharedPreferences不会被更新。这是场景:
我有两个使用相同共享首选项的项目。 Project1和Project2。它们是独立但相关的应用程序。它们使用相同的 key 签名,并使用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();
完成此操作后,我将通过调用
finish()
返回Project1。然后,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 not being updated after initial commit
SharedPreferences value is not updated
这些无济于事,因为我已经在这样做了。
我在两个 list 中都设置了WRITE_EXTERNAL_STORAGE。 fileName是相同的(否则,当我重新进入该应用程序时,我将无法读取该文件)。
编辑:
我应该注意,因为我以为自己面临比赛条件,所以我确实尝试使用
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
换句话说,它正在读取和写入同一文件。但是,它会保留它在项目中首次打开时所具有的映射。即使我关闭了该项目,映射仍然保留,直到强制停止应用程序为止。
最佳答案
最终答案:
代替getSharedPreferences(fileName, Context.MODE_PRIVATE);
和getSharedPreferences(fileName, Context.MODE_MULTI_PROCESS);
根据文件:
我知道在这方面有一个简单的疏忽。
关于android - SharedPreferences未更新,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12630926/