【发布时间】:2012-09-19 19:15:30
【问题描述】:
我遇到了一个奇怪的问题,即 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();
完成后,我通过调用 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
这些没有帮助,因为我已经在这样做了。
我在两个清单中都设置了 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
换句话说,它正在读取和写入同一个文件。但是,它保留了它在项目中首次打开时的映射。即使我关闭了项目,映射仍然存在,直到应用程序被强制停止。
【问题讨论】:
-
你在这样做吗 SharedPreferences prefs = getSharedPreferences(getPreferencesFileName(), Context.MODE_PRIVATE);在 OnCreate 上?
-
没有。比那晚很多。在 Project1 中,它将在我正在使用的片段的 onCreateView() 中,然后在 onResume() 中。在 Project2 中,我正在延迟加载首选项并将数据写入文件中。