我在开发一款有两项活动的简单Android游戏时注意到了这种行为。
游戏有2个活动,第一个是允许用户选择对手类型,等级等的屏幕,第二个是实际游戏画面。 第二个活动创建GameManager类的对象,该对象处理所有游戏处理。 这个GameManager类还创建了一个CountDownTimer,它开始提示用户输入(在超时时游戏默认为对手)。
我注意到如果用户退出第二个活动(返回到第一个活动)然后再次启动新游戏,则前一个计时器仍在运行直到完成。 我已经通过显式取消定时器(来自第二个活动的onDestroy())来处理这个问题,因为只需将timerobject设置为'null'就不会取消定时器。
然而,我很好奇为什么以前的计时器在我的活动第一次退出后仍在运行?在退出时,GC是否应该删除第二个Activity(以及它创建的任何子对象)实例化的所有对象?很高兴知道观察到的行为背后的原因吗?
TIA
答案 0 :(得分:4)
退出时,GC是否应该删除第二个Activity(以及它创建的所有子对象)实例化的所有对象?
这不是垃圾收集的工作原理。 GC不负责“删除对象” - 它负责拾取“孤立”对象并释放其资源。即便如此,GC也不能保证及时到达所有孤儿。
除此之外,任何可能是“系统”对象且需要明确释放的对象如果您的代码不这样做,可能永远不会被释放。 GC的其他问题可能包括创建其他线程(创建它们的Activity除外)可能引用的对象。
你提到你的'计时器',但不解释你正在使用什么类的课程。我建议专门阅读关于该类的内容,看看对于ceation / deletion有什么影响(可能是显式的'释放'资源)。
GC在任何平台上都是一个非常灰暗的区域。使用Android通常非常直接,但由于活动生命周期的性质,很难预测会发生什么。
通常使用活动中的onCreate,onPause和onResume以及savedInstanceState和SharedPreferences之类的东西来跟踪发生的事情。
答案 1 :(得分:0)
CountDownTimer
未绑定到您已经发现的活动。在这些情况下需要注意的是,类在其构造函数中没有收到任何Context
。因此它不能与活动绑定。