【问题标题】:Repeated calls to SharedPreferences apply() causes OutOfMemoryError重复调用 SharedPreferences apply() 会导致 OutOfMemoryError
【发布时间】: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 个)。
  • 是的,但这就是你的代码的问题

标签: android sharedpreferences


【解决方案1】:

我的解决方案是在位置上使用 Firebase 单一事件侦听器,put 我的数千个项目,然后调用 apply()。您还必须跟踪您已经看到的键(HashSetStrings)。

然后,创建一个ChildEventListener,如果密钥存在于我的HashSet 中,则忽略onChildAdded

【讨论】:

    猜你喜欢
    • 2018-05-29
    • 2011-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-07
    • 2019-02-10
    • 2021-07-18
    • 1970-01-01
    相关资源
    最近更新 更多