该文中提到的解决方案有个小问题,在dialog消失后,第二次show的时候,因为回调了onWindowDetached()方法,将点击回调事件清空,导致第二次show的dialog按钮点击事件没有反馈。
解决方案,利用Android提供的lifecycle事件,在onDestory生命周期函数执行的时候,将点击回调的代理置空。
具体代码如下:
/**
* 避免Dialog 引发的内存泄漏
* @property delegateOrNull OnClickListener?
* @constructor
*/
class DetachableClickListener private constructor(
private var delegateOrNull: DialogInterface.OnClickListener?
) : DialogInterface.OnClickListener, LifecycleObserver {
override fun onClick(dialog: DialogInterface, which: Int) {
delegateOrNull?.onClick(dialog, which)
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun clearOnDetach() {
delegateOrNull = null
}
companion object {
@JvmStatic
fun wrap(delegate: DialogInterface.OnClickListener?): DetachableClickListener {
return DetachableClickListener(delegate)
}
}
}
使用:
val detachableClickListener = DetachableClickListener
.wrap(DialogInterface.OnClickListener { dialog, _ ->
callBackListener?.onClickPositive(dialog)
})
setPositiveButton(positiveText, detachableClickListener)
if (context is FragmentActivity) {
context.lifecycle.addObserver(detachableClickListener)
}