什么时候可以在android中使用强引用,这个代码是否泄漏?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了什么时候可以在android中使用强引用,这个代码是否泄漏?相关的知识,希望对你有一定的参考价值。
我不清楚什么时候最好使用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
举行吗?我们如何确定何时可以获得强引用与弱引用?
不,这不是内存泄漏。
简化的参考图可能如下所示:
没错,图表确实包含循环引用,但垃圾收集器完全能够检测和解决这种情况。在系统失去对Fragment
的引用之后,整个图表将是GC,这通常是在它从屏幕上被解除的时候。
我无法设想需要使用WeakReference
来防止内存泄漏的情况。 (我不是说他们不存在,我只是想不出来。)
我认为WeakReferences
是高级内存管理任务的工具,在一般应用程序开发中很少出现。喜欢:管理大型项目的集合,如果其中一些获得GC(当内存耗尽),那就没关系,但是你宁愿将它们保存在RAM中。
IOW:不要随意查找任何你不需要的引用,你应该没问题。
现代JVM有一个非常强大的垃圾收集器。它通过检测从gc根完全隔离的对象,设法收集甚至循环引用。你可以在这里阅读更多关于这个主题的信息:How Garbage Collection Really Works
通过使用弱引用。但是,您可以加快gc的工作,因为在此对象的所有强引用都消失后立即收集此引用。
以上是关于什么时候可以在android中使用强引用,这个代码是否泄漏?的主要内容,如果未能解决你的问题,请参考以下文章