场景
让 Activity A 实现一个监听器 OnCompleteListener。该监听器将被传递到另一个线程以进行网络调用。因此,当 Web 服务完成时,我们会收到 Activity A 的回调。
问题
假设 Web 服务调用已经开始,并且在中间,屏幕旋转,因此 Activity 的当前实例将被销毁。既然我们为网络服务传递了A的引用,它会被销毁吗? A 的初始实例会被泄露吗?
如果内存泄漏,那么我们如何清理不需要的实例呢? Activity 回调的最佳替代方案是什么?
最佳答案
对于你的第一个问题:是的,它会导致内存泄漏。
独立于 Activity 生命周期运行的后台任务可能会很麻烦。如果我们设置网络调用监听器,它将保存对您的 Activity 的引用以更新数据。现在,如果要旋转设备,则会创建一个新 Activity 来替换旧 Activity 。由于系统服务肯定会比任何 Activity 的生命周期都长,因此您的“网络管理器 - 将为监听器触发更新事件”将仍然保留对旧 Activity 的引用,从而使 GC 无法回收该 Activity 资源仍然与该“旧” Activity 相关,导致内存泄漏。
如果您想检查,请转储 Java 堆并使用分析器任务
,并查看引用树
,其中可以识别保持 Activity Activity 的引用。
对于你的第二个问题:不,你无法清理泄漏的内存/不需要的实例,..甚至使用System.gc()
强制GC工作。很简单,因为 GC 不知道该实例是否仍在使用中。如果它发现仍然有对您的实例的引用,它会将该实例标记为可访问并且不会清除。
如果可能的话,GC 应该已经具备了它的功能,开发人员就不会日复一日地为内存泄漏而头痛了。
关于java - 如果一个 Activity 实现了回调并且该引用被传递给另一个线程中的网络调用并且屏幕被旋转,这是否是内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909688/