重复调用SharedPreferences apply()会导致OutOfMemoryError

时间:2015-12-31 07:17:52

标签: android sharedpreferences

我正在使用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。

1 个答案:

答案 0 :(得分:0)

我的解决方案是在该位置使用Firebase单一事件监听器,enum我的数千个项目,然后调用put。您还必须跟踪已经看过的密钥(apply()HashSet

然后,设置String,如果我的ChildEventListener中存在该密钥,则忽略onChildAdded