Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/210.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
Android 弱参考网络回调坏主意?_Android_Memory Leaks_Callback_Garbage Collection_Weak References - Fatal编程技术网

Android 弱参考网络回调坏主意?

Android 弱参考网络回调坏主意?,android,memory-leaks,callback,garbage-collection,weak-references,Android,Memory Leaks,Callback,Garbage Collection,Weak References,在我们的项目中,我们发现了由于网络回调导致的内存泄漏。网络请求从片段中触发,响应通过对片段的回调返回。问题是,当用户离开片段时,它不会被垃圾收集,因为回调与它绑定。因此存在内存泄漏 我建议的解决方案是在片段顶部取消回调引用。这样,GC就可以处理它了 我的同事建议的另一个解决方案是使用WeakReference来调用。问题是回调经常被垃圾收集,以至于我们甚至没有从回调中得到响应(有时用户在等待响应)。问题是弱引用可以随时使用GC进行垃圾收集 我假设在这个场景中,使用WeakReference不是一

在我们的项目中,我们发现了由于网络回调导致的内存泄漏。网络请求从片段中触发,响应通过对片段的回调返回。问题是,当用户离开片段时,它不会被垃圾收集,因为回调与它绑定。因此存在内存泄漏

我建议的解决方案是在片段顶部取消回调引用。这样,GC就可以处理它了

我的同事建议的另一个解决方案是使用WeakReference来调用。问题是回调经常被垃圾收集,以至于我们甚至没有从回调中得到响应(有时用户在等待响应)。问题是弱引用可以随时使用GC进行垃圾收集

我假设在这个场景中,使用WeakReference不是一个好主意


你们认为呢?

我认为应该对外部类使用弱引用,而不是回调。 真正的泄漏不是回调,而是外部类。 这意味着,您使用的回调不是应该收集的回调,而是回调


如果您有任何问题,请回答我:)

我认为回调侦听器的WeakReference不是一个好模式,因为您的回调侦听器很容易被GC调用,因为您的回调永远不会被调用。
但是我完全同意@MacFang answer
这不是回调真正的泄漏,而是外部类

同意这两个答案。谢谢你花时间回答

解决方案是将“片段”包装在弱引用中,而不是回调中,这样当网络操作完成时,我会检查片段是否仍然存在。当片段不存在时,GC将对其进行垃圾收集