其实一路过来无论是网上的资料还是LeakCanary都是告诉我们是说是DialogFragment发生了内存泄漏,但是罪魁祸首真的是DialogFragment吗?罪魁祸首是DialogFragment内部的Dialog啊,我们为什么一直揪着DialogFragment不放呢?为什么一直想着给DialogFragment治病呢?能不能给DialogFragment它内部的Dialog治治啊?
通过查看DialogFragment的源码我们发现它内部的mDialog是通过onCreateDialog方法生成的,而且这个方法是开放的。那么我们能不能通过重写这个方法,返回一个不会对DialogFragment持有强引用的Dialog不就完事了吗?
那么我们就重写一个Dialog名为NoLeakDialog:
public class NoLeakDialog extends Dialog {
public NoLeakDialog(@NonNull Context context, int themeResId) {
super(context, themeResId);
}
@Override
public void setOnCancelListener(@Nullable OnCancelListener listener) {
// 空实现,不持有外部的引用
}
@Override
public void setOnShowListener(@Nullable OnShowListener listener) {
// 空实现,不持有外部的引用
}
@Override
public void setOnDismiss