【问题标题】:Android - Google Maps API V2, Avoiding Memory LeakAndroid - Google Maps API V2,避免内存泄漏
【发布时间】:2015-02-20 01:58:20
【问题描述】:

我在SupportMapFragmet 上阅读this documentation,上面写着:

GoogleMap 获得的任何对象都与视图相关联。重要的是不要抓住超出视图生命周期的对象(例如 Marker)。否则会导致内存泄漏,因为视图不能被释放。

我对此感到有些困惑,因为没有办法修改Markers,除非你持有它们的引用,就像这里的许多问题所说的(比如thisthis)......那么有什么我想念的吗?

我目前正在使用HashMap 将我的Markers 与其他Objects 关联,但我不知道如何避免它。这会泄漏内存吗?是否有推荐的方法来编辑Markers 并避免内存泄漏?

【问题讨论】:

    标签: android google-maps memory-leaks google-maps-android-api-2


    【解决方案1】:

    标记很可能有对地图的引用,就像可绘制对象保存对它们所绑定的视图的内部引用一样。只要您持有标记,您可能还持有对地图的替代参考。

    我不知道他们为什么不使用弱引用。但如果他们这样做了,他们就不会觉得有必要警告您因抓住标记而泄漏。因此,如果您的 hashmap 比托管 map 的片段/活动的寿命更长,则很可能是内存泄漏。

    【讨论】:

    • 所以推荐的方法是保证地图发布时所有的标记都被释放?我想这将与onCreateViewonDestroyView 有关,但我仍然不能说我对此感到 100% 安全......
    • 是的,把它们放在一个集合中,只要地图被破坏,这个集合就会被破坏。托管片段或活动中的非静态集合。如果你在宿主之前销毁地图(例如分离它,或者用新地图替换),只需 .clear() 集合。
    • 好吧,我想诀窍是在地图被破坏之前破坏集合......这将与垃圾收集器何时清理有关,这可能会导致不可预知的行为......还是我错过了什么?
    • 在你销毁最后一个引用后,垃圾收集器最终会得到它。此外,垃圾收集器通常需要多次通过才能摆脱可能使对象保持活动状态的循环引用、终结器等。
    • 好的...明白了!我会留下这个问题,有时谷歌的一些人会出现在这里,这可能会引发官方回应......
    【解决方案2】:

    按照上述建议并在片段被销毁之前从地图中删除所有标记后,我仍然遇到内存泄漏。我的解决方案最终是在 Fragment 被销毁之前在我的自定义 TileOverlay 上调用 clearTileCache

    【讨论】:

      猜你喜欢
      • 2013-01-09
      • 1970-01-01
      • 2015-10-21
      • 1970-01-01
      • 2011-07-22
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多