首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >保存android首选项时的java.util.ConcurrentModificationException

保存android首选项时的java.util.ConcurrentModificationException
EN

Stack Overflow用户
提问于 2019-07-18 16:38:57
回答 1查看 823关注 0票数 4

我在生产中遇到了这个恼人的错误,导致我的应用程序崩溃。

我做PreferenceManager.getDefaultSharedPreferences(context).edit().putLong("key", value).apply();是为了保存许多基于用户的首选项

我用的是implementation 'androidx.preference:preference:1.0.0'

但我还是得到了很多

代码语言:javascript
运行
复制
Fatal Exception: java.util.ConcurrentModificationException
       at java.util.HashMap$HashIterator.nextEntry + 851(HashMap.java:851)
       at java.util.HashMap$KeyIterator.next + 885(HashMap.java:885)
       at com.android.internal.util.XmlUtils.writeSetXml + 355(XmlUtils.java:355)
       at com.android.internal.util.XmlUtils.writeValueXml + 693(XmlUtils.java:693)
       at com.android.internal.util.XmlUtils.writeMapXml + 300(XmlUtils.java:300)
       at com.android.internal.util.XmlUtils.writeMapXml + 269(XmlUtils.java:269)
       at com.android.internal.util.XmlUtils.writeMapXml + 235(XmlUtils.java:235)
       at com.android.internal.util.XmlUtils.writeMapXml + 192(XmlUtils.java:192)
       at android.app.SharedPreferencesImpl.writeToFile + 639(SharedPreferencesImpl.java:639)
       at android.app.SharedPreferencesImpl.-wrap2(SharedPreferencesImpl.java)
       at android.app.SharedPreferencesImpl$2.run + 535(SharedPreferencesImpl.java:535)
       at java.util.concurrent.ThreadPoolExecutor.runWorker + 1133(ThreadPoolExecutor.java:1133)
       at java.util.concurrent.ThreadPoolExecutor$Worker.run + 607(ThreadPoolExecutor.java:607)
       at java.lang.Thread.run + 761(Thread.java:761)

我知道我的许多偏好变化都发生在后台线程中,但是android应该是同步的,对吗?

我不知道哪些变化会导致崩溃,因为当它在android中的一个分隔线程中运行时,我无法获得更多关于崩溃的信息。

有人知道这是什么吗?如何在不将所有apply转换成commit的情况下解决这个问题?如何获得更多的信息?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-10-16 13:16:40

我也遇到了这个问题,但在共享Prefs本身中,这并不是一个线程安全问题,这显然是线程安全的问题(参见https://stackoverflow.com/a/4695567/445348)。

结果发现问题是传递到SharedPreferences.Editor.putStringSet()中的SharedPreferences.Editor.putStringSet()。如果您传入一个Set,然后在SharedPreferences迭代编写它的确切时间修改该Set,它会抛出这个错误。

为了避免这种情况,在将Set传递给putStringSet()之前,先复制一下它

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57099167

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档