LiveData使用不当,导致的内存泄露

本文探讨了Android中使用ASProfiler检测到的内存泄露问题,特别是Fragment由于与LiveData的生命周期绑定导致的内存泄露。当Activity保持对Fragment的引用,由于生命周期管理不当,即使Fragment被关闭,引用关系也无法释放,多次创建和销毁Fragment后引发内存泄露。解决办法在于正确管理LiveData的观察者和Fragment的生命周期。
摘要由CSDN通过智能技术生成

发现内存泄露

AS Profiler提供了内存泄露检测工具,简单方便,这里不介绍使用,网上教程很多。我看看内存泄露
在这里插入图片描述
这个Fragment泄露了6次
在这里插入图片描述
看这两行,知道是给LiveData传入的观察者导致的泄露,可是为啥呢?得看看它被谁持有了。
在这里插入图片描述
这块就涉及到了LiveData的实现原理,其实实现也简单,大家应该去学习一下。这块就简单说一下,每一个宿主(Activity/Fragment)都会有一个Lifecycle的实现,也就是LifecycleRegistry,它里面是有map用来存放需要感知生命周期的观察者对象的,这里的观察者对象是LiveData的内部类对象LifecycleBoundObserver,它里面封装了对LiveData的观察者对象mObserver,所以,这一系列的引用activity最终引用了Fragment,因为Activity一直没退出,这种引用关系释放不掉,即便fragment关闭了,这样多次启动关闭fragment,就会导致上面的泄露。

在这里插入图片描述
看上图,如果在Fragment中,如果LiveData和Activity生命周期绑定,就会出现8这个引用,Fragment多次创建和销毁,就会导致内存泄露。

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值