前言:handler通过内部类方法创建(如下),而这种方式往往会导致内存泄漏(熟悉Handler消息机制的都知道,mHandler会作为成员变量保存在发送的消息msg中,即msg持有mHandler的引用,而mHandler是Activity的非静态内部类实例,即mHandler持有Activity的引用,那么我们就可以理解为msg间接持有Activity的引用。msg被发送后先放到消息队列MessageQueue中,然后等待Looper的轮询处理(MessageQueue和Looper都是与线程相关联的,MessageQueue是Looper引用的成员变量,而Looper是保存在ThreadLocal中的)。那么当Activity退出后,msg可能仍然存在于消息对列MessageQueue中未处理或者正在处理,那么这样就会导致Activity无法被回收,以致发生Activity的内存泄露)
class OrderDetailActivity : Activity{
private val mHandler = object : Handler() {
override fun handleMessage(msg: Message) {
}
}
}
方案:自定义Handler通过弱引用+回调方式
1、创建WithoutLeakHandler
class WithoutLeakHandler(onHandlerCallBack: OnHandlerCallBack) : Handler(){
private val mWeakReference = WeakReference<OnHandlerCallBack>(onHandlerCallBack)
override fun handleMessage(msg: Message?) {
super.handleMessage(msg)
val callBack: OnHandlerCallBack? = mWeakReference.get()
callBack?.handleMessage(msg)
}
interface OnHandlerCallBack {
fun handleMessage(msg: Message?)
}
}
2、使用WithoutLeakHandler
class OrderDetailActivity : Activity(), WithoutLeakHandler.OnHandlerCallBack{
private val mHandler = WithoutLeakHandler(this)
override fun handleMessage(msg: Message?) {
}
override fun onDestroy() {
super.onDestroy()
mHandler.removeCallbacksAndMessages(null)
}
}