我的应用程序的一些用户抱怨有时(以随机方式)我的应用程序的设置将恢复到其默认状态(通常在重新启动手机后)。我从来没有设法重现这个问题。我认为这是因为在我的应用程序的许多地方我有一段代码调用共享首选项编辑器并提交更改 - 如果我尝试提交多个更改,它是否可以解决共享首选项文件的破坏相同的偏好文件同时? (多线程应用程序)
我真的迷路了。我试着在网上找了几个小时才找到一个没有成功的解决方案。
如果有人有想法,我可以开始调查,我将不胜感激。
谢谢, 阿米特莫兰
答案 0 :(得分:16)
我会回答其他答案 - 如果你不想破坏文件,你需要避免冲突 - 我会进一步暗示你可能会误导SharedPreferences。
SP旨在存储有关您应用的小部分信息 - 用户设置,如音量或是否播放音乐等等。
SP不是为存储经常更改的数据和/或大量数据而设计的,尝试这样做是个坏主意(出于您发现的原因和其他一些原因)。
请记住,SP实际上只是一个XML文件 - 每次更改它时都会产生解析和重新创建的开销!
我认为,在多个线程中更新SP的应用程序的想法有点疯狂 - 您需要一种更好的方法来管理和存储您正在保存的数据 - 它将为您提供多个付款方式方式...
答案 1 :(得分:6)
根据SharedPreferences.Editor documentation:
请注意,当两个编辑器同时修改首选项时,最后一个调用commit将获胜。
由此我得知多个同时提交不会消除您的首选项,但如果同时使用多个Editor
实例,则可能并非您尝试编写的所有更改都会被写入。为避免这种情况,您可以将所有首选项修改放在synchronized块中,甚至可以使用一个同步静态方法来编写所有首选项。
答案 2 :(得分:1)
我建议您使用单身人士来管理偏好。是否通过实施true java singleton或使用Android的Application Context执行此操作取决于您。 (参见this question了解/反对每个的好几个参数)
对于像SharedPreferences
这样的东西,这是一种管理它们的好方法,特别是对于多线程应用程序。这可能会消除一些关于提交是否相互冲突的质疑。这可能不是整个问题,但它可以从一开始就开始。
答案 3 :(得分:0)
我遇到了类似的问题:我的偏好没有得到可靠的保存。在某些设备上(在我的情况下是XOOM-Tablet)数据有时会丢失,有时则不会丢失。我在提交新数据之前只需在编辑器上调用clear()就解决了这个问题。
Shared Preferences get lost after shutting down device or killing the app
答案 4 :(得分:0)
我发现我在SharedPreferences
中丢失了一个特定条目,打开了编辑器,对其执行了getString
,然后committing
而没有在条目上执行putString
首先,即使没有必要的变化。一旦我在putString
中存根以保存值,无论如何,该条目在commit
之后停止消失。