Android 重复调用SharedReferences apply()会导致OutOfMemoryError
我正在使用FirebaseAndroid 重复调用SharedReferences apply()会导致OutOfMemoryError,android,sharedpreferences,Android,Sharedpreferences,我正在使用FirebaseOnChildadedlistener在我的Android应用程序中持久存储某些数据。当应用程序启动时,可能会触发数千次。每次触发时,我都使用SharedReferencesapply来编写一个简单的键/值对。键和值本身不是很大,但可能有几千个存储在SharedReference中 我对使用apply感到很兴奋,因为它在内存缓存和延迟实际的SharedReferencesXML写入方面发挥了一些神奇的作用。然而,我发现如果我在几秒钟内调用apply1000-2000次,
OnChildaded
listener在我的Android应用程序中持久存储某些数据。当应用程序启动时,可能会触发数千次。每次触发时,我都使用SharedReferencesapply
来编写一个简单的键/值对。键和值本身不是很大,但可能有几千个存储在SharedReference中
我对使用apply
感到很兴奋,因为它在内存缓存和延迟实际的SharedReferencesXML写入方面发挥了一些神奇的作用。然而,我发现如果我在几秒钟内调用apply
1000-2000次,就会出现OutOfMemory错误
在内部,SharedReferencesImpl似乎正在基于旧的Map
创建一个新的Map
,前提是对实际XML的写入仍在排队。然而,这导致了Java堆上似乎有几千个Map
条目(我相信),并且我得到了一个OutOfMemory
错误
也许我应该每隔50次左右调用
commit
调用apply
——这样我就不会遇到内存不足的错误,尽管我可能会看到一个小的性能影响?我该怎么办?无论如何,这似乎有点骇人。我的解决方案是在该位置上使用Firebase单事件侦听器,放置我的数千项,然后调用应用()
。您还必须跟踪已经看到的关键点(一个String
s的HashSet
)
然后,制作一个ChildEventListener
,只要忽略onchildaded
,如果密钥存在于我的HashSet
,我的解决方案是在该位置使用一个Firebase单事件监听器,put
我的数千项,然后调用apply()
。您还必须跟踪已经看到的关键点(一个String
s的HashSet
)
然后,制作一个ChildEventListener
,只要忽略onchildaded
,如果该键存在于我的哈希集中
共享首选项并不用于存储如此大的数据。你应该选择sql数据库,而不是阅读。我发现很难相信SharedReferences不能存储几千个键/值对,其中每个键和值都只有几个字符(最多50个)。是的,但这就是你的代码共享首选项的问题,它不意味着存储如此大的数据。您应该选择sql数据库,而不是head。我发现很难相信SharedReferences不能存储几千个键/值对,其中每个键和值只有几个字符(最多50个)。是的,但这就是代码的问题