在整个消息机制中,message又称为task,它封装了任务携带的信息和处理该任务的handler。尽管Message有public的默认构造方式,但是读者应该通过Message.obtain()来从消息池中获取空消息对象,以节约资源;除非消息池中没有空消息对象,就先new()消息。
下面分析下Message类的属性结构部分:
public final class Message implements Parcelable {
/**用户定义的消息代码,以便接收者(Handler)可以识别这个消息是关于什么的。 每个处理程序(Handle)
都有自己的消息代码名称空间,因此您不必担心与其他处理程序(Handler)发生冲突。**/
public int what;
//这两个参数,如果用户只需要存储几个整数值,相比较于setData(Bundle)setData(),代价更低
public int arg1;
public int arg2;
/**这是一个发送给接受者的一个随意的数据,如果使用Messager来进行发送数据进行跨进程的通信,那么当前
的obj如果实现了Parcelable就一定不能够为空指针,对于其他的数据的传输,我们一般使用setData方法就
可以了。但是需要注意的是,对于高于android.os.Build.VERSION_CODES#FROYO的版本,这里的Parcelable
对象是不支持的。 **/
public Object obj;
//可选的Messenger,可以发送对此消息的回复。如何使用的语义取决于发送者和接收者。
public Messenger replyTo;
/*package*/ static final int FLAG_IN_USE = 1 << 0; //标记消息被使用
/*package*/ static final int FLAG_ASYNCHRONOUS = 1 << 1; // 标记消息是异步
//flags表示这个Message有没有在使用,1表示在池中,等待复用,0表示正在被使用
/*package*/ int flags;
//Message发送之后,何时才能被处理
/*package*/ long when;
//Message所携带的数据
/*package*/ Bundle data;
//表示这个消息被哪个Handler处理
/*package*/ Handler target;
//用Handler.post一个Runnable,这个Runnable也是被包装成Message对象的
/*package*/ Runnable callback;
// 表示下一个可用的消息(记录链表中的下一个元素)
/*package*/ Message next;
//第一个变量其实就是充当锁的作用,避免多线程争抢资源,导致脏数据
private static final Object sPoolSync = new Object();
//sPool代码消息池的头消息
private static Message sPool;
//sPoolSize表示有多少个可以被重用的对象(消息池中可用的消息个数即没有被使用的Message对象的个数)
private static int sPoolSize = 0; //记录链表长度
//定义队列缓存消息的最大的长度(表示链表的最大长度)
private static final int MAX_POOL_SIZE = 50;
//消息池存放的核心方法
private static boolean gCheckRecycle = true;