猿问

什么时候可以在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以某种方式保持在 a 中WeakReference吗?我们如何决定何时可以使用强引用还是弱引用?


鸿蒙传说
浏览 142回答 2
2回答

凤凰求蛊

现代 JVM 有一个非常强大的垃圾收集器。它通过检测与 gc 根完全隔离的对象,设法收集甚至循环引用。通过使用弱引用。但是,您可以加快 gc 的工作,因为在此对象上的所有强引用都消失后,将立即收集此引用。

jeck猫

不,这不是内存泄漏。简化的参考图可能如下所示:确实,该图确实包含循环引用,但垃圾收集器完全有能力检测和解决这种情况。在系统失去对 的引用后,整个图形将被 GC 处理Fragment,这通常是在它从屏幕上消失的时候。我不能图谋,其中一个的情况下WeakReference将需要以防止内存泄漏。(我不是说它们不存在,我只是想不出一个。)我认为这WeakReferences是一种用于高级内存管理任务的工具,这种工具在一般应用程序开发中很少出现。像:管理的大型项目,它的集合OK,如果他们中的一些获得GC'd(如内存用完),但你会宁愿让他们在RAM中。IOW:不要留下任何你不需要的参考资料,你应该没问题。
随时随地看视频慕课网APP

相关分类

Java
我要回答