2011-05-21 136 views
1

我注意到这个行为,同时开发一个简单的Android游戏,它有2个活动。Android活动垃圾收集

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

我注意到,如果用户退出第二个活动(返回到第一个),然后再次启动一个新游戏,则前一个定时器仍在运行直到完成。 我通过显式取消定时器(来自第二个活动的onDestroy())来处理此事,因为只将timerobject设置为'null'未取消定时器。

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

TIA

回答

4

不应该GC已经删除第二活动实例化的所有对象(对象和它创造的任何孩子),当它退出?

这不是Garbage Collection的工作原理。 GC不负责'删除对象' - 它负责拾取'孤立'对象并释放资源。即使如此,GC也不保证及时得到所有的孤儿。除此之外,如果您的代码没有这样做,任何可能是“系统”对象并且需要明确释放的对象都可能永远不会被释放。 GC的其他问题可能包括创建其他线程(创建它们的Activity除外)可能参考的对象。

你提到你的'计时器',但不要解释你正在使用什么样的课程。我建议仔细阅读关于该课程的内容,看看这些内容对ceation /删除有什么影响(可能是明确的“释放”资源)。

GC是任何平台上非常灰暗的区域。对于Android来说,它通常非常直接,但是由于Activity生命周期的特性,很难预测会发生什么。

通常在活动中使用onCreate,onPause和onResume以及诸如savedInstanceState和SharedPreferences之类的东西来跟踪发生了什么。

+0

正如我在第一篇文章中提到的,我正在使用'CountDownTimer'(来自android.os.CountDownTimer)。猜猜这不是所有众所周知的:) - http://developer.android.com/reference/android/os/CountDownTimer.html没有太多关于创建/删除这个。嗯..所以我想把它设置为null是没有帮助的呢? – 2011-05-21 11:24:11

+0

@ source.rar:道歉,回头看我现在看到。因为它是一个抽象类和android.os的一部分,那么将任何引用设置为'null'不会像普通类一样工作。正如你发现的那样,你需要明确地调用它的cancel()方法 - 这是我理解一个类的细节(比如它是抽象等)并相应地处理它的关键。有时需要在系统级调用诸如“取消”或“发布”等方法。但是,对于这类类,您自己的应用程序不支持GC。 – Squonk 2011-05-21 11:37:33

+0

谢谢。所以一般来说,在Android中,程序员如何知道要注意这种行为? – 2011-05-21 15:04:54

0

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

+0

听起来不太好。然后,任何不接受上下文的用户对象都不会被绑定到活动,也不会被GCed。 – Kiran 2015-05-24 03:04:05