什么时候可以在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举行吗?我们如何确定何时可以获得强引用与弱引用?

答案

不,这不是内存泄漏。

简化的参考图可能如下所示:

references graph

没错,图表确实包含循环引用,但垃圾收集器完全能够检测和解决这种情况。在系统失去对Fragment的引用之后,整个图表将是GC,这通常是在它从屏幕上被解除的时候。

我无法设想需要使用WeakReference来防止内存泄漏的情况。 (我不是说他们不存在,我只是想不出来。)

我认为WeakReferences是高级内存管理任务的工具,在一般应用程序开发中很少出现。喜欢:管理大型项目的集合,如果其中一些获得GC(当内存耗尽),那就没关系,但是你宁愿将它们保存在RAM中。

IOW:不要随意查找任何你不需要的引用,你应该没问题。

另一答案

现代JVM有一个非常强大的垃圾收集器。它通过检测从gc根完全隔离的对象,设法收集甚至循环引用。你可以在这里阅读更多关于这个主题的信息:How Garbage Collection Really Works

通过使用弱引用。但是,您可以加快gc的工作,因为在此对象的所有强引用都消失后立即收集此引用。

以上是关于什么时候可以在android中使用强引用,这个代码是否泄漏?的主要内容,如果未能解决你的问题,请参考以下文章

Android性能提升之强引用软引用弱引用虚引用使用

谈谈Java对象的强引用,软引用,弱引用,虚引用分别是什么

Android 内存泄漏

Android 关键类(RefBase,sp, wp)

ThreadLocalMap中为什么valu是强引用,不是弱引用

ThreadLocalMap中为什么valu是强引用,不是弱引用