【问题标题】:Android Activity Garbage CollectionAndroid Activity 垃圾收集
【发布时间】:2011-05-21 10:37:34
【问题描述】:

我在开发一个包含 2 个活动的简单 Android 游戏时注意到了这种行为。

游戏有两个活动,第一个是允许用户选择对手类型、级别等的屏幕,第二个是实际游戏屏幕。 第二个活动创建一个处理所有游戏处理的 GameManager 类的对象。 这个 GameManager 类还创建了一个 CountDownTimer,它开始提示用户输入(超时时游戏默认为对手)。

我注意到,如果用户退出第二个活动(返回第一个活动)然后再次启动新游戏,则前一个计时器仍在运行直到完成。 我已经通过显式取消计时器(从第二个活动的 onDestroy() )来处理这个问题,因为只是将 timerobject 设置为“null”并没有取消计时器。

但是我很好奇为什么即使在我的活动第一次退出后前一个计时器仍在运行? GC 退出时不应该删除第二个 Activity 实例化的所有对象(以及它创建的任何子对象)吗?很高兴知道观察到的行为背后的原因?

TIA

【问题讨论】:

    标签: android garbage-collection


    【解决方案1】:

    GC不应该在退出时删除第二个Activity实例化的所有对象(以及它创建的任何子对象)吗?

    这不是垃圾收集的工作方式。 GC 不负责“删除对象”——它负责拾取“孤立”对象并释放它们的资源。即使这样,GC 也不能保证及时到达所有孤儿。

    此外,如果您的代码不这样做,任何可能是“系统”对象并且需要显式释放的对象都可能永远不会被释放。 GC 的其他问题可能包括创建其他线程(创建它们的 Activity 除外)可能引用的对象。

    您提到了您的“计时器”,但没有解释您使用的是哪种类。我建议专门阅读有关该类的内容,看看对 ceation/deletion 有什么影响(可能是明确的“释放”资源)。

    GC 在任何平台上都是一个非常灰色的区域。对于 Android,它通常非常直接,但由于 Activity 生命周期的性质,很难预测会发生什么。

    通常在活动中使用 onCreate、onPause 和 onResume 以及 savedInstanceState 和 SharedPreferences 之类的东西来跟踪正在发生的事情。

    【讨论】:

    • 正如我在第一篇文章中提到的,我使用的是“CountDownTimer”(来自 android.os.CountDownTimer)。猜猜这不是众所周知的:) - developer.android.com/reference/android/os/CountDownTimer.html 没有太多关于创建/删除的内容。嗯..所以我想将它设置为 null 没有帮助吗?
    • @source.rar: 抱歉,现在回头看看。由于它是一个抽象类并且是 android.os 的一部分,因此将您对它的任何引用设置为“null”不会与普通类一样工作。正如您所发现的,您需要显式调用它的 cancel() 方法 - 这是我关于理解类的细节(例如它是抽象的等)并相应地对待它的观点。有时需要在系统级别使用类调用诸如“取消”或“释放”等方法。然而,有了这些类,你自己的应用程序的 GC 就不会参与其中。
    • 谢谢。所以一般来说,对于 Android,程序员怎么知道要注意这种行为?
    • @source.rar:总的来说,这一切都很无聊,而且主要是检查 Android 参考中是否有任何可能连接到“系统”(定时器、线程等)developer.android.com/reference/classes.html 的情况。使用 Android 编程通常只是使用 Java 编程的一个例子,但理解 Activity 生命周期是关键。我打印了活动参考中的流程图并固定在我的墙上...developer.android.com/reference/android/app/Activity.html
    【解决方案2】:

    CountDownTimer 未绑定到您已经发现的活动。在这些情况下要注意的提示是类在其构造函数中没有收到任何Context。因此它不能绑定到一个活动。

    【讨论】:

    • 听起来不太好。那么任何不接受上下文的用户对象都不会被绑定到activity,也不会被GCed。
    猜你喜欢
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 1970-01-01
    • 2018-12-30
    • 1970-01-01
    • 1970-01-01
    • 2010-12-13
    • 2012-05-04
    相关资源
    最近更新 更多