为了账号安全,请及时绑定邮箱和手机立即绑定

什么时候可以在android中使用强引用并且这段代码会泄漏?

什么时候可以在android中使用强引用并且这段代码会泄漏?

鸿蒙传说 2021-08-25 15:21:41
我不清楚什么时候最好使用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 的工作,因为在此对象上的所有强引用都消失后,将立即收集此引用。


查看完整回答
反对 回复 2021-08-25
?
jeck猫

TA贡献1909条经验 获得超7个赞

不,这不是内存泄漏。

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

//img1.sycdn.imooc.com//6125efa90001fdc504840098.jpg

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

我不能图谋,其中一个的情况下WeakReference需要以防止内存泄漏。(我不是说它们不存在,我只是想不出一个。)

我认为这WeakReferences是一种用于高级内存管理任务的工具,这种工具在一般应用程序开发中很少出现。像:管理的大型项目,它的集合OK,如果他们中的一些获得GC'd(如内存用完),但你会宁愿让他们在RAM中。

IOW:不要留下任何你不需要的参考资料,你应该没问题。


查看完整回答
反对 回复 2021-08-25
  • 2 回答
  • 0 关注
  • 141 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信