【问题标题】:Android: removing/destroying objects when screen is rotatedAndroid:屏幕旋转时删除/销毁对象
【发布时间】:2010-01-25 11:59:57
【问题描述】:

我发现在一个或多个屏幕旋转后性能会下降,我认为这可能是因为每次屏幕旋转时应用的主 Activity 都会被破坏并重新创建,并且我的应用必须在该情况下泄漏内存发生。

我已经读到,与预期相反,并非所有由应用程序的主 Activity(或在该 Activity 调用的类中)创建的对象在 Activity 被销毁时都会被销毁。具体来说,我想我已经读过(虽然我现在找不到在哪里)如果 View 使用一个大的位图成员对象,那么应该覆盖 Activity 的 onDestroy() 方法并且应该显式地回收位图。

Activity销毁时是否还有其他需要销毁或移除的对象?听众呢?是否有关于此主题的综合教程或指南?

【问题讨论】:

    标签: android memory-leaks object


    【解决方案1】:

    是否有综合教程或 关于这个主题的指南?

    不是。

    还有其他需要的对象吗 被销毁或删除时 活动被破坏?关于什么 听众?

    如果我正确理解拜占庭 Android 内存模型,位图是不寻常的,部分原因是它们使用 16MB 堆之外的内存。

    除了大型位图之外,您真正需要担心的最重要的事情是阻止正常垃圾收集工作的事情。任何直接或间接地从静态上下文中保留活动的东西都会阻止活动被垃圾收集。示例包括:

    • 类上的静态数据成员(例如,您使用自己的服务构建自己的侦听器框架,因此您的服务会保留一个侦听器,该侦听器会保留您的活动)
    • 线程(例如,您手动 fork 一个后台线程并且不终止它)

    【讨论】:

    • 感谢您的及时答复。由于我不知道如何创建自己的服务或分叉线程,我认为这些对我来说都不是问题。我不明白的一件事是,考虑到 GC 会在对象超出范围时从对象中回收内存的基本原则,为什么当 Activity 结束时在 Activity 中创建的位图不会发生这种情况。我觉得如果我理解了这一点,我将有更好的机会识别可能导致类似问题的其他事情。
    • "我不明白的一点是,考虑到 GC 会在对象超出范围时从对象中回收内存的基本原则,为什么在创建的位图上不会发生这种情况活动结束时的活动”——对于初学者来说,GC 不是立即的。它是异步发生的。对于像位图这样的大内存块,这可能为时已晚,因此有一种机制可以主动向 Android 提示位图可以回收(例如,供您的下一个 Activity 使用)。
    • 我有另一个大位图,它被定义并用作我的一个类的方法中的局部变量。我一直假设,因为它纯粹是在本地使用,所以没有必要回收它。但是,考虑到你对 GC 工作原理的解释,我现在想知道我是否也需要回收这个位图?
    • 大位图比大多数局部变量需要更多的关注。我会尝试主动回收它,而不是仅仅依靠垃圾收集。
    • 好的。我现在添加了代码来回收“临时”位图。如果 DDMS 中的 SysInfo 图包括位图和堆,则此更改似乎减少了内存需求,尽管我必须调查每次屏幕旋转时仍有小泄漏。
    【解决方案2】:

    请注意,将android:configChanges="orientation" 放入 Manifest 可防止 Activity 在屏幕旋转时被销毁。所以我不再需要担心是否需要销毁或删除单个位图或其他对象! (感谢 Ribo 在另一个线程中指出这一点。)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-22
      • 2012-05-31
      • 2015-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多