1. 介绍
Handler任务模型是Android系统消息传递的基础,Activity、Service等创建、以及触摸消息的分发种种都会先把任务抛到UI线程对应的MessQueue中进行处理。而在Handler任务模型中,Message类是对消息的封装,本篇主要是分析Handler消息处理模型中Message类的源码分析。
2. 源码分析
Message一般我们会这么使用,这些都是Message常用public属性
Message msg = Message.obtain();
msg.what = 0;
msg.arg1 = 0;
msg.arg2 = 0;
msg.obj = new Object();
每个Message都对应一个target也就是一个Handler对象,没有target的Message会在MessageQueue中做特殊用途,在后面MessageQueue源码分析时,会给予说明。Message类提供了很多的方法用来获取Message或者给Message类的属性赋值,其中最重要的是Message的静态缓存池和Message的回收。
- 静态缓存池
Message类有一个类变量private static Message mPool和实例变量Message next。在Handler文档说明中建议我们使用 Message.obtain()方法来获取一个Message对象而不是直接new Message对象。
/**
* Return a new Message instance from the global pool. Allows us to
* avoid allocating new objects in many cases.
*/
public static Message obtain() {
synchronized (mPoolSync) {
if (mPool != null) {
Message m = mPool;
mPool = m.next;
m.next = null;
return m;
}
}
return new Message();
}
每个Message都对应一个Message对象,我们可知mPool会对应一个Message链表,上面代码从mPool回收池中取出第一个Message对象返回。
再看下Message中recycle方法对Message的回收
/**
* Return a Message instance to the global pool. You MUST NOT touch
* the Message after calling this function -- it has effectively been
* freed.
*/
public void recycle() {
synchronized (mPoolSync) {
if (mPoolSize < MAX_POOL_SIZE) {
clearForRecycle();
next = mPool;
mPool = this;
}
}
}
这里clearForRecycle方法将要被回收的Message对象的属性赋值为初始值,然后将该Message添加到mPool头部完成对Message的回收操作。
3. 结束语
这里主要分析了Message类中的静态回收池对Message缓存和回收操作,其他方法主要是对属性的修改所以没有对其分析,下一节会对Handler任务模型的Looper类进行源码分析。