代码之家  ›  专栏  ›  技术社区  ›  Sayooj Valsan

网络回调的弱引用坏主意?

  •  6
  • Sayooj Valsan  · 技术社区  · 9 年前

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

    我提出的解决方案是取消片段的onStop上的回调引用。这样,GC可以处理它。

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

    我假设在这种情况下,使用WeakReference不是一个好主意。

    你们觉得怎么样?

    3 回复  |  直到 9 年前
        1
  •  2
  •   Mac Fang    9 年前

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

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

        2
  •  1
  •   Folyd    9 年前

    我认为回调监听器的WeakReference不是一个好模式,因为你的回调监听器很容易被GC调用,然后你的回调永远不会被调用。 然而,我完全同意@MacFang的回答 It's not the callback really leak but the outer class .

        3
  •  0
  •   Sayooj Valsan    9 年前

    同意这两个答案。感谢您抽出时间回答。

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