【发布时间】:2015-12-31 07:17:51
【问题描述】:
我正在使用 Firebase onChildAdded 侦听器在我的 Android 应用程序中持久存储某些数据。当应用程序启动时,这可能会触发数千次。每次触发时,我都使用 SharedPreferences apply 编写一个简单的键/值对。键和值本身不是很大,但可能有几千个存储在 SharedPreferences 中。
我对使用 apply 感到很兴奋,因为它在缓存内存和延迟实际的 SharedPreferences XML 写入方面发挥了一些作用。但是,我发现如果我在几秒钟内调用 apply 1,000-2,000 次,我会收到 OutOfMemory 错误。
在内部,如果对实际 XML 的写入仍在排队,SharedPreferencesImpl 似乎正在基于旧的Map 创建一个新的Map。但是,这导致 Java 堆上似乎有几千个 Map 条目(我相信),并且我收到了 OutOfMemory 错误。
也许我应该每 50 次左右调用 apply 就调用一次 commit - 这样我就不会遇到 OutOfMemory 错误,尽管我可能会看到一个小的性能损失?我该怎么办?无论如何,这似乎有点骇人听闻。
【问题讨论】:
-
共享偏好并不意味着存储如此大的数据。你应该选择 sql 数据库来代替
-
我很难相信 SharedPreferences 不能存储几千个键/值对,其中每个键和值只有几个字符(最多 50 个)。
-
是的,但这就是你的代码的问题