阅读 243

解决leakcanary上报的Dialog内存泄漏

问题原因:github.com/hehonghui/a…

该文中提到的解决方案有个小问题,在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)
                }
复制代码
关注下面的标签,发现更多相似文章
评论