Handler导致的内存泄露

210 阅读1分钟

class MainActivity : Activity(){

private val mHandler = object : Handler() {

    override fun handleMessage(msg: Message?) {
        super.handleMessage(msg)

    }
}

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    mHandler.sendMessageDelayed(mHandler.obtainMessage().apply {
        what = 0x11
        obj = ""
    }, 2000)
    finish()
}

}

记一次Handler内存泄露的笔试题。

activity finish后,由于匿名内部类会持有外部类activity引用,导致内存泄露。

但是以为考点是内存泄露,直接就回答直接添加static。后面面试官告诉我这是最差的方法。

后面掘金重新复习了一遍发现有2个方法解决,一个是直接添加static,一个是根据生命周期来手动释放

以下代码基于jetpack lifecycle

fun Handler.lifecycle(owner: LifecycleOwner? = null) { owner?.lifecycle?.addObserver(object : LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    fun onDestroy() {
        removeCallbacksAndMessages(null)
    }
})

}