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))

作者:帅得不敢出门

你可能感兴趣的:(Android平台,kotlin,开发语言,android)