我在生产环境中遇到一个非常烦人的错误,导致我的应用程序崩溃。
我使用PreferenceManager.getDefaultSharedPreferences(context).edit().putLong("key", value).apply();
来保存很多基于用户的首选项。
我正在使用implementation 'androidx.preference:preference:1.0.0'
但是仍然遇到很多问题。
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 API应该是同步的,对吗?
我不知道哪些更改导致了崩溃,因为它在Android API的一个单独的线程中运行,我无法获取有关崩溃的更多信息。
有人知道这可能是什么问题吗?如何解决而不将所有apply
变成commit
?如何获得更多信息?
SharedPreferences
并不像SQLite那样专为大量使用而设计。您可能需要在这些写入操作之间添加自己的同步层。如果您将SharedPreferences
I/O放在存储库单例中,则有一个自然的位置来放置同步逻辑。 - CommonsWareapply
调用之后发生的,这是SharedPreferences
内部线程正在执行其工作... - Rafael Limacommit()
。 - CommonsWare