kotlin无内存泄露的Handler写法

不管泄露最简单写法

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

上面这种写法编译器会警告:‘constructor Handler()’ is deprecated. Deprecated in Java

无警告不管泄露写法

    private val handler : Handler = object : Handler(Looper.myLooper()!!) {
        override fun handleMessage(msg: Message) {
        }
    }

注意上面要加!!这两个感叹号,代表是只有不为空时才执行,不加会报错:Type mismatch: inferred type is Looper? but Looper was expected

上面两种写法都存在内存泄露的风险,因为handler会默认拥有外部类的this,比如某个MainActivity,会导致这个Activity无法回收。 规避的方法是使用弱引用。

无泄露最终版本

// 假设在MainActivity类中使用handler
private class UIHandler(val mWeakRef: WeakReference<MainActivity>) : Handler(Looper.myLooper()!!) {
        override fun handleMessage(msg: Message) {
            super.handleMessage(msg)
             // 注意这里加个.run,代表是跑在this中的,方便直接访问外部类,当然也可以不用run,
             // 但是所有访问外部类的地方都要用mWeakRef.get()->的形式,写起来麻烦点
            mWeakRef.get()?.run {
                when (msg.what) {
                	// xxxxxx
                }
            }
        }
    }

// 使用弱引用 
private val handler = UIHandler(WeakReference(this))

作者:帅得不敢出门

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值