问题来源
在之前我的一篇文章中我就指出了我在项目中如何会出现 内存泄漏的问题的,有兴趣的小伙伴可以点击获取原文看看这个问题出现的来龙去脉,在这里我就不过多做说明了。下面我们用最简单直接粗暴的方式进入主题。
在我们开发android应用程序的时候,通常会写出如下代码
private Handler mHandler = new Handler(){
@Override
public void handleMessage(Message msg){
//do something
}
};
其实上面的代码是会产生内存泄漏的,如果你有使用Android lint工具的话,它会给我们提示一个警告
In Android, Handler classes should be static or leaks might occur。
翻译过来就是:在android中,Handler这个类应该被定义成静态的,否则可能出现内存泄漏的情况
发生内存泄漏的原因
说的挺吓人的,就一个Handler处理消息事件而已,怎么可能会出现内存泄漏的情况呢?说是内存泄漏,那到底如何发生内存泄漏的呢?又在哪里发生的内存泄漏?接下来我们来一起探究一下到底是如何发生内存泄漏的。
- 当一个android应用程序启动的时候,frameworks会自动为这个应用程序在主线程创建一个Looper对象。这个被创建的Looper对象也有它主要的工作,它主要的工作就是不断地处理消息队列中的消息对象。在android应用程序中,所有主要的框架事件(例如Activity的生命周期方法,按钮的点击事件等等)都包含在消息对象里面,然后被添加到Looper要处理的消息队列中,主线程的Loope