今天在使用定时器的时候使用到了Handler,且使用如下
Handler handler = new Handler(){
@Override
public void handleMessage(Message msg) {
//do some code
super.handleMessage(msg);
}
}
编译成功,但却提示This Handler class should be static or leaks might occur,意思就是说:Handler类必须声明为静态的,否则将会内存泄漏,接着我想当然的把handler声明为静态的,结果也是同样出现这个警告,于是上谷歌搜索了下,大致了解里面的缘由:在handler对象生成时,它将和主线程Looper对象的消息队列相关联,消息队列中的消息将会持有一个对Handler的引用,且Handler作为内部类将持有外部类的一个引用(参见java内部类的讲解,其中内部类可以访问外部类的private成员,就是因为其持有外部类的一个引用),当外部类生命周期结束时候,其上下文由于被引用而不能GC,导致资源泄漏。当声明成静态内部类时,将不会持有外部类的引用。如果要访问外部类的话可以使用弱应用。改进后的代码如下:
static class MyHandler extends Handler{
WeakReference<MainActivity>mActivity;
MyHandler(MainActivity act){
mActivity = new WeakReference<MainActivity>(act);
}
@Override
public void handleMessage(Message msg) {
MainActivity MA = mActivity.get();
//do some code
super.handleMessage(msg);
}
}
如有错误,敬请指正,谢谢!