Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如果某个活动实现了回调,并且在另一个线程中传递了网络调用的引用,并且屏幕被旋转,这是否是内存泄漏?_Java_Android_Android Activity_Memory Leaks_Listener - Fatal编程技术网

Java 如果某个活动实现了回调,并且在另一个线程中传递了网络调用的引用,并且屏幕被旋转,这是否是内存泄漏?

Java 如果某个活动实现了回调,并且在另一个线程中传递了网络调用的引用,并且屏幕被旋转,这是否是内存泄漏?,java,android,android-activity,memory-leaks,listener,Java,Android,Android Activity,Memory Leaks,Listener,场景 让活动A实现一个侦听器对CompleteListener说。此侦听器将被传递到另一个线程以进行网络调用。因此,当webservice完成时,我们会得到一个对活动a的回调 问题 假设web服务调用已经启动,并且在两者之间,屏幕会旋转,因此活动的当前实例将被销毁。既然我们为web服务传递了A的引用,它会被销毁吗?A的初始实例是否会泄漏 如果内存泄漏,那么我们如何清理不需要的实例?在活动上进行回调的最佳选择是什么?它将在android意义上被“销毁”onPause(),onStop(),onDe

场景

让活动A实现一个侦听器对CompleteListener说。此侦听器将被传递到另一个线程以进行网络调用。因此,当webservice完成时,我们会得到一个对活动a的回调

问题

假设web服务调用已经启动,并且在两者之间,屏幕会旋转,因此活动的当前实例将被销毁。既然我们为web服务传递了A的引用,它会被销毁吗?A的初始实例是否会泄漏


如果内存泄漏,那么我们如何清理不需要的实例?在活动上进行回调的最佳选择是什么?

它将在android意义上被“销毁”<将调用code>onPause(),
onStop()
onDestroy()
,但对象本身将泄漏。因此,强烈建议不要这样做。您需要的是查看并侦听来自数据层的更新。当网络调用完成时,它将向侦听器(活动)推送更新(如果存在),否则它将缓存数据。当活动在旋转后返回时,它可以检查缓存中的结果。

它将在android意义上被“销毁”<将调用code>onPause(),
onStop()
onDestroy()
,但对象本身将泄漏。因此,强烈建议不要这样做。您需要的是查看并侦听来自数据层的更新。当网络调用完成时,它将向侦听器(活动)推送更新(如果存在),否则它将缓存数据。当活动在旋转后返回时,它可以检查缓存的结果。

对于第一个问题:是,它将导致内存泄漏

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

如果要进行检查,请转储Java堆并使用
Analyzer任务
,然后查看
引用树
,其中可以识别使活动保持活动状态的引用

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


如果有可能的话,GC应该已经有了它的功能,开发人员也不会天天担心内存泄漏。

对于您的第一个问题:是的,它会导致内存泄漏

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

如果要进行检查,请转储Java堆并使用
Analyzer任务
,然后查看
引用树
,其中可以识别使活动保持活动状态的引用

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


如果可能的话,GC应该已经有了它的功能,开发人员也不会天天担心内存泄漏。

是的,这是内存泄漏。让活动观察内存或磁盘存储中的活动。让服务写入该存储。将活动与服务分离。可能可以帮助您做到这一点。这将导致内存泄漏,就像您未注销
OnLocationUpdateListener
@EugenPechanec时发生的一个众所周知的情况一样,非常感谢。我已经修改了问题的最后一部分。请看一看。请提供一个更详细的答案。谢谢again@HarikumarAlangode不,您不能清除泄漏的内存!如果可能的话,GC应该已经有了这个特性是的,这是内存泄漏。让活动观察内存或磁盘存储中的活动。让服务写入该存储。将活动与服务分离。可能可以帮助您做到这一点。这将导致内存泄漏,就像您未注销
OnLocationUpdateListener
@EugenPechanec时发生的一个众所周知的情况一样,非常感谢。我已经修改了问题的最后一部分。请看一看。请提供一个更详细的答案。谢谢again@HarikumarAlangode不,您不能清除泄漏的内存!如果可能的话,GC应该已经有了这个功能,非常感谢你。我在问题的最后部分补充了一些内容。请看一看。再次感谢你不能