Android活动垃圾收集

时间:2011-05-21 10:37:35

标签: android garbage-collection

我在开发一款有两项活动的简单Android游戏时注意到了这种行为。

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

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

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

TIA

2 个答案:

答案 0 :(得分:4)

  

退出时,GC是否应该删除第二个Activity(以及它创建的所有子对象)实例化的所有对象?

这不是垃圾收集的工作原理。 GC不负责“删除对象” - 它负责拾取“孤立”对象并释放其资源。即便如此,GC也不能保证及时到达所有孤儿。

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

你提到你的'计时器',但不解释你正在使用什么类的课程。我建议专门阅读关于该类的内容,看看对于ceation / deletion有什么影响(可能是显式的'释放'资源)。

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

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

答案 1 :(得分:0)

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