我不清楚什么时候最好使用WeakReference
来避免android中的内存泄漏。示例:
片段代码:
containerView.setDataForDisplay(customer, new CustomListener() {
@Override
public void buttonClicked(@NonNull Customer customer) {
if(handler != null) {
handler.buttonClickedForCustomer(customer);
}
}
});
自定义LinearLayout
public void setDataForDisplay(List<Customer> customer, CustomListener listener) {
// view setup code
someView.setOnClickListener( v -> {
if(listener != null) {
listener.buttonClicked(v.getTag());
}
});
}
匿名类CustomListener
引用了包含片段的this
。
该匿名类作为侦听器传递到一个包含视图,该视图最终将进行回调。
我的问题是这是否会导致内存泄漏?
listener
是否应该以某种方式保留在WeakReference
中?我们该如何确定何时可以使用强引用还是弱引用?
答案 0 :(得分:1)
不,这不是内存泄漏。
简化的参考图可能看起来像这样:
是的,该图确实包含一个循环引用,但是垃圾收集器完全能够检测和解决这种情况。在系统失去对Fragment
的引用之后,整个图形将被GC处理,这通常是在屏幕上将其关闭的时间。
我无法设想需要<{>} 以防止内存泄漏的情况。 (我并不是说它们不存在,我只是无法提出一个。)
我认为WeakReference
是用于高级内存管理任务的工具,这种工具在一般应用程序开发中很少出现。像:管理一个大型项目的集合,如果其中一些被GC回收(由于内存用完),则确定,但您 将它们保留在RAM中
爱荷华州:不要随便找些不需要的参考,你应该没事。
答案 1 :(得分:1)
现代JVM具有非常强大的垃圾收集器。它通过检测与gc根完全隔离的对象来设法收集甚至循环引用。您可以在此处阅读有关此主题的更多信息: https://guides.rubyonrails.org/form_helpers.html
通过使用弱引用。但是,您可以加快gc的工作,因为在此对象上的所有强引用都将消失之后,将立即收集该引用。