Handler、Loop和Message 的关系
三者相互之间的关系:Looper中有一个Message队列,队列里面存储的是一个个待处理的Message;Message 中有一个 Handler,这个 Handler 是用来处理Message的。
Message
Meaasge是Handler接收和处理的消息对象;MessageQueue是消息队列,采用先进先出的方式来管理Message。
Message类分析
<span style="font-size:14px;"><span style="font-size:12px;">public final class Message implements Parcelable {
// what为用户自定义的消息编码,接收者通过编码来识别信息
public int what;
//arg1、arg2用来存放整型数据
public int arg1;
public int arg2;
//obj用来传递任意类型的对象
public Object obj;
// replyTo是消息管理器
public Messenger replyTo;
...
/*package*/ int flags;
/*package*/ long when;
/*package*/ Bundle data;
/*package*/ Handler target;
/*package*/ Runnable callback;
...
}</span>
</span>
Message对象通常不是直接new出来的,一般是通过Handler.obtainMessage() 方法来获得Message对象。
Handler.class中的obtainMessage()源码如下,从全局消息池中返回一个新的消息
<span style="font-size:14px;"><span style="font-size:12px;">public final Message obtainMessage()
{
return Message.obtain(this);//调用Message中的 public static Message obtain(Handler)方法
}</span></span>
Message.class中的obtain()方法
<span style="font-size:14px;"><span style="font-size:12px;">public static Message obtain(Handler h) {//返回一个新的消息实例,并设置target成员变量的值
Message m = obtain();
m.target = h;
return m;
}
public static Message obtain() {//返回一个新的消息实例,避免使用new关键字直接实例化消息
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;