我不清楚什么时候最好使用WeakReference以避免 android 中的内存泄漏。示例:片段中的代码:containerView.setDataForDisplay(customer, new CustomListener() { @Override public void buttonClicked(@NonNull Customer customer) { if(handler != null) { handler.buttonClickedForCustomer(customer); } } }); 自定义里面的代码 LinearLayoutpublic 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吗?我们如何决定何时可以使用强引用还是弱引用?
2 回答
凤凰求蛊
TA贡献1825条经验 获得超4个赞
现代 JVM 有一个非常强大的垃圾收集器。它通过检测与 gc 根完全隔离的对象,设法收集甚至循环引用。
通过使用弱引用。但是,您可以加快 gc 的工作,因为在此对象上的所有强引用都消失后,将立即收集此引用。
jeck猫
TA贡献1909条经验 获得超7个赞
不,这不是内存泄漏。
简化的参考图可能如下所示:
确实,该图确实包含循环引用,但垃圾收集器完全有能力检测和解决这种情况。在系统失去对 的引用后,整个图形将被 GC 处理Fragment
,这通常是在它从屏幕上消失的时候。
我不能图谋,其中一个的情况下WeakReference
将需要以防止内存泄漏。(我不是说它们不存在,我只是想不出一个。)
我认为这WeakReferences
是一种用于高级内存管理任务的工具,这种工具在一般应用程序开发中很少出现。像:管理的大型项目,它的集合OK,如果他们中的一些获得GC'd(如内存用完),但你会宁愿让他们在RAM中。
IOW:不要留下任何你不需要的参考资料,你应该没问题。
添加回答
举报
0/150
提交
取消