内存泄露原因:当一个对象已经不再被使用时,本该被回收但却因为有另外一个正在使用的对象持有它的引用,从而导致它不能被回收。
解决方案1:在Java中,非静态内部类或匿名内部类都默认持有外部类的引用,使用Handler时,需将Handler对象申明为静态变量或使用弱引用。当Handler内消息队列未处理完(或延时处理消息时),不持有外部引用,不影响外部对象的注销回收。
解决方案2:当外部类对象结束生命周期时,清空Handler内消息队列。比如在Activity的onDestroy()方法中清空消息队列:
@Override
protected void onDestroy() {
super.onDestroy();
// 外部类Activity生命周期结束时,清空消息队列,结束Handler生命周期
mHandler.removeCallbacksAndMessages(null);
mHandler = null;
}