孽缘
自DialogFragment在Android3.0之后作为一种特殊的Fragment引入,官方建议使用DialogFragment代替Dialog或者AllertDialog来实现弹框的功能,因为它可以更好的管理Dialog的生命周期以及可以更好复用。
然而建议虽好,实用须谨慎,在开发的过程中我们只要接入LeakCanary则经常会收到DialogFragment导致内存泄露的小鸟惊喜。
对于为什么DialogFragment会引起内存泄漏,网上资料一大堆,而且分析得也比较详尽,这里就不再多说了。总结起来就是内部的Dialog持有了DialogFragment的引用,导致DialogFragment在该回收的时候无法回收。
那么Dialog是如何持有了DialogFragment的引用的呢?主要就是DialogFragment中在onActivityCreated方法中调用了Dialog的setOnDismissListener和setOnCancelListener这两个方法,将DialogFragmen设置了进去导致的。
别人是怎么解决的
- 将
setOnDismissListener和setOnCancelListener设置为空
既然是DialogFragment中在onActivityCreated方法中调用了Dialog的setOnDismissListener和setOnCancelListener这两个方法导致的,那么解决方法不是很简单么?
我们继承DialogFragment,然后重写onActivityCreated方法,在super之后再次将setOnDismissListener和setOnCancelListener设置为空不就可以吗?

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

被折叠的 条评论
为什么被折叠?



