可以在android中使用强引用,并且此代码是否泄漏?

时间:2018-09-01 12:49:43

标签: java android android-fragments memory-leaks android-lifecycle

我不清楚什么时候最好使用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中?我们该如何确定何时可以使用强引用还是弱引用?

2 个答案:

答案 0 :(得分:1)

不,这不是内存泄漏。

简化的参考图可能看起来像这样:

references graph

是的,该图确实包含一个循环引用,但是垃圾收集器完全能够检测和解决这种情况。在系统失去对Fragment的引用之后,整个图形将被GC处理,这通常是在屏幕上将其关闭的时间。

我无法设想需要<{>} 以防止内存泄漏的情况。 (我并不是说它们不存在,我只是无法提出一个。)

我认为WeakReference是用于高级内存管理任务的工具,这种工具在一般应用程序开发中很少出现。像:管理一个大型项目的集合,如果其中一些被GC回收(由于内存用完),则确定,但您 将它们保留在RAM中

爱荷华州:不要随便找些不需要的参考,你应该没事。

答案 1 :(得分:1)

现代JVM具有非常强大的垃圾收集器。它通过检测与gc根完全隔离的对象来设法收集甚至循环引用。您可以在此处阅读有关此主题的更多信息: https://guides.rubyonrails.org/form_helpers.html

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