DialogFragment内存泄露问题能不能一次性改好

针对DialogFragment在Android应用中导致的内存泄漏问题,本文提出了一种通过自定义NoLeakDialog来解决的方法,同时保证了点击空白区域或返回键后的正常行为。

孽缘

自DialogFragment在Android3.0之后作为一种特殊的Fragment引入,官方建议使用DialogFragment代替Dialog或者AllertDialog来实现弹框的功能,因为它可以更好的管理Dialog的生命周期以及可以更好复用。
然而建议虽好,实用须谨慎,在开发的过程中我们只要接入LeakCanary则经常会收到DialogFragment导致内存泄露的小鸟惊喜。

对于为什么DialogFragment会引起内存泄漏,网上资料一大堆,而且分析得也比较详尽,这里就不再多说了。总结起来就是内部的Dialog持有了DialogFragment的引用,导致DialogFragment在该回收的时候无法回收。

那么Dialog是如何持有了DialogFragment的引用的呢?主要就是DialogFragment中在onActivityCreated方法中调用了Dialog的setOnDismissListenersetOnCancelListener这两个方法,将DialogFragmen设置了进去导致的。

别人是怎么解决的

  • setOnDismissListenersetOnCancelListener设置为空

既然是DialogFragment中在onActivityCreated方法中调用了Dialog的setOnDismissListenersetOnCancelListener这两个方法导致的,那么解决方法不是很简单么?
我们继承DialogFragment,然后重写onActivityCreated方法,在super之后再次将setOnDismissListenersetOnCancelListener设置为空不就可以吗?

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值