Android活动垃圾收集

Android活动垃圾收集,android,garbage-collection,Android,Garbage Collection,我在开发一个简单的Android游戏时注意到了这种行为,它有两个活动 游戏有两个活动,第一个是屏幕,允许用户选择对手类型、级别等,第二个是实际游戏屏幕。 第二个活动创建GameManager类的对象,该类处理所有游戏处理。 这个GameManager类还创建一个倒计时,它开始提示用户输入(超时时,游戏默认为对手) 我注意到,如果用户退出第二个活动(返回第一个活动),然后再次启动新游戏,则前一个计时器仍在运行,直到完成。 我通过显式地取消计时器(从第二个活动的onDestroy()中)来处理这个问

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

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

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

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

短暂性脑缺血发作

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

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

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

你提到了你的“计时器”,但没有解释你使用的是什么类。我建议专门阅读一下这个类,看看它对删除/删除(可能是明确的“释放”资源)有什么影响

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

通常,在活动中使用onCreate、onPause和onResume,以及savedInstanceState和SharedReferences等工具来跟踪正在发生的事情

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

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

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

你提到了你的“计时器”,但没有解释你使用的是什么类。我建议专门阅读一下这个类,看看它对删除/删除(可能是明确的“释放”资源)有什么影响

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


一般来说,在活动中使用onCreate、onPause和onResume以及savedInstanceState和SharedReferences等工具来跟踪正在发生的事情。

倒计时程序
没有像您已经发现的那样绑定到活动。在这些情况下需要注意的一点是,类在其构造函数中没有接收任何
上下文。因此,无法将其绑定到活动。

倒计时程序
未绑定到活动,正如您已经发现的那样。在这些情况下需要注意的一点是,类在其构造函数中没有接收任何
上下文。因此它不能绑定到活动。

正如我在第一篇文章中提到的,我使用的是“倒计时”(来自android.os.CountDownTimer)。我猜这并不都是众所周知的:)-没有太多关于创建/删除此的信息。隐马尔可夫模型。。所以我想把它设为null是没有帮助的?@source.rar:抱歉,现在回想起来我明白了。由于它是一个抽象类,并且是android.os的一部分,因此将对它的任何引用设置为“null”将与普通类的工作方式不同。正如您所发现的,您需要显式地调用它的cancel()方法——这是我关于理解类的细节(例如它是抽象的等等)并相应地处理它的观点。有时需要在系统级用类调用诸如“cancel”或“release”等方法。然而,有了这些类,你自己的应用程序的GC就没有了。谢谢。所以一般来说,对于Android,程序员怎么知道要注意这种行为呢?@source.rar:一般来说,这都很无聊,主要是检查Android引用中可能连接到“系统”的任何东西(计时器、线程等)。使用Android编程通常只是使用Java编程的一个例子,但理解活动生命周期是关键。我把活动参考中的流程图打印出来并钉在墙上。。。正如我在第一篇文章中提到的,我使用的是“倒计时”(来自android.os.CountDownTimer)。我猜这并不都是众所周知的:)-没有太多关于创建/删除此的信息。隐马尔可夫模型。。所以我想把它设为null是没有帮助的?@source.rar:抱歉,现在回想起来我明白了。因为它是一个抽象类,是android.os的一部分