无内存泄漏Handler的实现

前言:handler通过内部类方法创建(如下),而这种方式往往会导致内存泄漏(熟悉Handler消息机制的都知道,mHandler会作为成员变量保存在发送的消息msg中,即msg持有mHandler的引用,而mHandler是Activity的非静态内部类实例,即mHandler持有Activity的引用,那么我们就可以理解为msg间接持有Activity的引用。msg被发送后先放到消息队列MessageQueue中,然后等待Looper的轮询处理(MessageQueue和Looper都是与线程相关联的,MessageQueue是Looper引用的成员变量,而Looper是保存在ThreadLocal中的)。那么当Activity退出后,msg可能仍然存在于消息对列MessageQueue中未处理或者正在处理,那么这样就会导致Activity无法被回收,以致发生Activity的内存泄露)

class OrderDetailActivity : Activity{

    private val mHandler = object : Handler() {
        override fun handleMessage(msg: Message) {

        }
    }

}

方案:自定义Handler通过弱引用+回调方式

1、创建WithoutLeakHandler

class WithoutLeakHandler(onHandlerCallBack: OnHandlerCallBack) : Handler(){
    private val mWeakReference = WeakReference<OnHandlerCallBack>(onHandlerCallBack)

    override fun handleMessage(msg: Message?) {
        super.handleMessage(msg)
        val callBack: OnHandlerCallBack? = mWeakReference.get()
        callBack?.handleMessage(msg)
    }

    interface OnHandlerCallBack {
        fun handleMessage(msg: Message?)
    }
}

2、使用WithoutLeakHandler

class OrderDetailActivity : Activity(), WithoutLeakHandler.OnHandlerCallBack{

    private val mHandler = WithoutLeakHandler(this)

    override fun handleMessage(msg: Message?) {

    }

    override fun onDestroy() {
        super.onDestroy()
        mHandler.removeCallbacksAndMessages(null)
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值