我正在使用Firebase onChildAdded
侦听器在我的Android应用中持久存储某些数据。当应用程序启动时,这可能会发生数千次。每次激活时,我都使用SharedPreferences apply
来编写一个简单的键/值对。键和值本身并不是很大,但SharedPreferences中可能存有几千个。
我对使用apply
感到很兴奋,因为它在缓存内存和延迟实际的SharedPreferences XML写入方面做了一些魔术。但是,我发现如果我在几秒钟内拨打apply
1,000-2,000次,我就会收到OutOfMemory错误。
在内部,如果对实际XML的写入仍然排队,则SharedPreferencesImpl似乎是基于旧Map
创建新的Map
。但是,这导致Java堆上似乎有几千个Map
条目(我相信),并且我收到OutOfMemory
错误。
也许我应该每隔50次左右拨打commit
我拨打apply
- 这样我就不会遇到OutOfMemory错误,虽然我可能会看到一个小的性能影响?我该怎么办?无论如何,这看起来有点像hacky。
答案 0 :(得分:0)
我的解决方案是在该位置使用Firebase单一事件监听器,enum
我的数千个项目,然后调用put
。您还必须跟踪已经看过的密钥(apply()
个HashSet
。
然后,设置String
,如果我的ChildEventListener
中存在该密钥,则忽略onChildAdded
。