版权声明:本文为博主原创文章,转载请注明出处http://blog.csdn.net/qq_17513815
最近得病了,看到代码黄色警报不是很爽。虽然不影响运行,但是看着代码不干净不利索。
Handler,线程通信,用的比较多吧,今天写代码一如往常的:
感觉没什么错误,怎么出黄色警报了。
This Handler class should be static or leaks might occur
大体意思是说 Handler应该是静态的,否则会造成内存溢出。
然后将Handler用static修饰,ok,警报消失。
但是遇到问题了:不设置成静态会造成内存溢出?要毁三观?然后就开始寻求网络资源的帮助
http://www.cnblogs.com/jevan/p/3168828.html
在这里找到了答案,MessageQueue中的消息队列会一直持有对handler的引用,而作为内部类的handler会一直持有外部类的引用,就会导致外部类不能被GC回收。当我们发延时很长的msg时就容易出现泄漏。所以此处应该设置为static,然后Handler就会跟随类而不是跟随类的对象加载,也就不再持有外部类的对象引用。
单单这个问题可以直接看上面这篇文章。
通过搜索还找到了另一个解决黄色警报的解决方案:在新建Handler对象的时候传入一个Handler.Callback对象。
以前还没注意过这个参数呢,这个方法,返回值都是干啥的?
然后去看了一下这一块的源码:
Looper从MQ中拿到一个msg就会调用handler中的dispatchMessage方法,然后有此方法进行分发处理。想到触摸时间分发了木有?
最后记录一下Message对象的获取,原来一直使用Message.obtain方法来获取,今天无意间发现了handler.obtainMessage方法也可以获取。
通过源码发现,其实handler.obtainMessage最终也是调用了Message中的一系列obtain方法。