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