handler发送消息的方法:
handler.sendMessage
handler.sendMessageAtTime
handler.sendMessageDelayed
handler.sendEmptyMessage
handler.sendEmptyMessageAtTime handler.sendEmptyMessageDelayed
handler.sendMessageAtFrontOfQueue
handler.post(runnable r)
handler.postDelayed(Runnable r,long mils)
handler.postAtTime(Runnable r)
handler.postAtFrontOfQueue(Runnable r)
除了sendMessageAtFrontOfQueue 以外send相关方法都会调用到sendMessageAtTime,sendMessageAtTime的源码如下:
public boolean sendMessageAtTime(Message msg, long uptimeMillis)
{
boolean sent = false;
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this;
sent = queue.enqueueMessage(msg, uptimeMillis);
}
else {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
}
return sent;
}
Message 类有一个Handler 类型的成员变量叫target
该段代码会设置msg.target为当前的handler。然后把message入队,返回入队操作结果为send的结果。
而对于handler的post方法 其源码如下:
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r), 0);
}
postAtTime 源码如下:
public final boolean postAtTime(Runnable r, long uptimeMillis)
{
return sendMessageAtTime(getPostMessage(r), uptimeMillis);
}
postDelayed 源码如下:
public final boolean postDelayed(Runnable r, long delayMillis)
{
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
可以看出,post相关方法最终也是调用send的相关方法。
这里通过getPostMessage(Runnable r)将一个runnable对象放入message,并构造相关的message对象
getPostMessage 源码如下:
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
getPostMessage会构造新的Message,同时将该Message的callback属性设置成传入的runnable。
所以post相关方法也是发送的message.
--------------------------------------------------->>>>>>>>
关于message.obtain()方法,源码如下:
/**
* Return a new Message instance from the global pool. Allows us to
* avoid allocating new objects in many cases.
*/
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize–;
return m;
}
}
return new Message();
}
该方法返回一个新的Message对象,相比new Message性能要更好,具体以后在分析(TODO)
--------------------------------------------------->>>>>>>>
Message obtain的一系列重载方法都是调用obtain()方法,然后将不同的参数设置进去。源码如下:
public static Message obtain() {
synchronized (sPoolSync) {
if (sPool != null) {
Message m = sPool;
sPool = m.next;
m.next = null;
m.flags = 0; // clear in-use flag
sPoolSize–;
return m;
}
}
return new Message();
}
public static Message obtain(Message orig) {
Message m = obtain();
m.what = orig.what;
m.arg1 = orig.arg1;
m.arg2 = orig.arg2;
m.obj = orig.obj;
m.replyTo = orig.replyTo;
m.sendingUid = orig.sendingUid;
if (orig.data != null) {
m.data = new Bundle(orig.data);
}
m.target = orig.target;
m.callback = orig.callback;
return m;
}
public static Message obtain(Handler h) {
Message m = obtain();
m.target = h;
return m;
}
public static Message obtain(Handler h, Runnable callback) {
Message m = obtain();
m.target = h;
m.callback = callback;
return m;
}
public static Message obtain(Handler h, int what) {
Message m = obtain();
m.target = h;
m.what = what;
return m;
}
public static Message obtain(Handler h, int what, Object obj) {
Message m = obtain();
m.target = h;
m.what = what;
m.obj = obj;
return m;
}
public static Message obtain(Handler h, int what, int arg1, int arg2) {
Message m = obtain();
m.target = h;
m.what = what;
m.arg1 = arg1;
m.arg2 = arg2;
return m;
}
public static Message obtain(Handler h, int what,
int arg1, int arg2, Object obj) {
Message m = obtain();
m.target = h;
m.what = what;
m.arg1 = arg1;
m.arg2 = arg2;
m.obj = obj;
return m;
}
Message的sendToTarget方法会调用target字段的handler来发送消息,源码如下:
public void sendToTarget() {
target.sendMessage(this);
}