gpt4 book ai didi

java - 如果 Activity 实现回调并且该引用被传递给另一个线程中的网络调用并且屏幕旋转,这是否是内存泄漏?

转载 作者:行者123 更新时间:2023-11-29 08:30:18 25 4
gpt4 key购买 nike

场景

让 Activity A 实现一个监听器 say OnCompleteListener。这个监听器将被传递到另一个线程进行网络调用。因此,当网络服务完成时,我们会收到对 Activity A 的回调。

问题

假设 web 服务调用已经开始,并且在其间,屏幕旋转,因此 Activity 的当前实例将被销毁。由于我们为 Web 服务传递了 A 的引用,它会被销毁吗? A 的初始实例会泄露吗?

如果内存泄漏,那么我们如何清理不需要的实例?落在 Activity 上的回调的最佳替代方案是什么?

最佳答案

对于你的第一个问题:会导致内存泄漏

独立于 Activity 生命周期运行的后台任务可能会很麻烦。如果我们设置一个网络调用监听器,它将保存对您的 Activity 的引用以更新数据。现在,如果要旋转设备,则会创建一个新 Activity 来替换旧 Activity 。由于系统服务肯定会比任何 Activity 都长寿,因此您的“网络管理器 - 将为监听器触发更新事件”将仍然持有对旧 Activity 的引用,从而使 GC 无法回收资源仍然与该“旧” Activity 相关联,导致内存泄漏。

如果您想要检查,转储 Java 堆并使用 Analyzer Tasks 并查看 Reference Tree,其中可以识别保持 Activity Activity 的引用。

对于你的第二个问题:不,你不能清除泄漏的内存/不需要的实例,..甚至可以使用 System.gc() 强制 GC 工作。仅仅是因为 GC 不知道这个实例是否仍在使用中。如果它看到仍然有对您的实例的引用,它会将此实例标记为可访问并且不会清除。

如果可能的话,GC 应该已经具备了它的功能,并且开发人员不会每天都在为内存泄漏而头疼。

关于java - 如果 Activity 实现回调并且该引用被传递给另一个线程中的网络调用并且屏幕旋转,这是否是内存泄漏?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48909688/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com