不管泄露最简单写法
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))
作者:帅得不敢出门