用Lint分析时,若使用内部类创建handler,会报内存泄露的问题。造成内存泄露的原因是message和activity的生命周期不一样,当acticvity销毁的时候,message还在消息队列中,导致GC无法进行垃圾回收。
private Handler mHandler = new Handler() {
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
//do something ...
}
}
}
以下两种方法可以解决handler引起的内存泄露:
1.用静态类声明Handler,并且用弱引用来引用activity
代码如下:
private static class MyHandler extends Handler {
private final WeakReference mActivity;
public MyHandler(SampleActivity activity) {
mActivity = new WeakReference(activity);
}
@Override
public void handleMessage(Message msg) {
SampleActivity activity = mActivity.get();
if (activity != null) {
// do something...
}
}
PS:在Java 中,非静态的内部类和匿名内部类都会隐式地持有其外部类的引用,静态的内部类不会持有外部类的引用。
2.在onPause或onDestroy中释放message和callbacks
添加如下代码:
mHandler.removeCallbacksAndMessages(null);