Handler源码解析(九)

2014-11-24 10:14:16 · 作者: · 浏览: 5
ueue is exiting.
*/
public final boolean sendMessageAtFrontOfQueue(Message msg)
{
boolean sent = false;
MessageQueue queue = mQueue;
if (queue != null) {
msg.target = this;
sent = queue.enqueueMessage(msg, 0);
}
else {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
}
return sent;
}

把一个消息插入到message queue的队首。但是我们注意到在SendMessageAtTime中插入队列代码:

[java]
queue.enqueueMessage(msg, uptimeMillis);

在uptimeMillis时间后插入到队列,而在sendMessageAtFrotOfQueue中插入队列代码:

[java]
queue.enqueueMessage(msg, 0)

按照字面意思理解,就是立即插入队列,但是立刻插入队列也不能实现插到队首。那到底是如何实现的哪?这一点,将在MessageQueue源码分析中揭晓。
从511行到535行是从消息队列中删除对应的消息:


[java]
/**
* Remove any pending posts of messages with code 'what' that are in the
* message queue.
*/
public final void removeMessages(int what) {
mQueue.removeMessages(this, what, null, true);
}

/**
* Remove any pending posts of messages with code 'what' and whose obj is
* 'object' that are in the message queue. If token is null,
* all messages will be removed.
*/
public final void removeMessages(int what, Object object) {
mQueue.removeMessages(this, what, object, true);
}

/**
* Remove any pending posts of callbacks and sent messages whose
* obj is token. If token is null,
* all callbacks and messages will be removed.
*/
public final void removeCallbacksAndMessages(Object token) {
mQueue.removeCallbacksAndMessages(this, token);
}

541行,检查消息队列中是否存在相对应的消息:

[java]
/**
* Check if there are any pending posts of messages with code 'what' in
* the message queue.
*/
public final boolean hasMessages(int what) {
return mQueue.removeMessages(this, what, null, false);
}

/**
* Check if there are any pending posts of messages with code 'what' and
* whose obj is 'object' in the message queue.
*/
public final boolean hasMessages(int what, Object object) {
return mQueue.removeMessages(this, what, object, false);
}

555行:获取当前looper:

[java]
public final Looper getLooper() {
return mLooper;
}

往下,dump方法,从字面意思上理解:转储,具体作用,还不太了解,将在Looper源码解析中分析下。

[java]
public final void dump(Printer pw, String prefix) {
pw.println(prefix + this + " @ " + SystemClock.uptimeMillis());
if (mLooper == null) {
pw.println(prefix + "looper uninitialized");
} else {
mLooper.dump(pw, prefix + " ");
}
}

575行,获取当前Messenger:

[java]
final IMessenger getIMessenger() {
synchronized (mQueue) {
if (mMessenger != null) {
return mMessenger;
}
mMessenger = new MessengerImpl();
return mMessenger;
}
}

关于Messenger信使类,请关注以后源码分析。
591行:将一个Runnable封装成一个Message。


[java]
private final Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}

private final Message getPostMessage(Runnable r, Object token) {
Message m = Message.obtain();
m.obj = token;
m.callback = r;
return m;
}

getPostMessage这个方法在上面所说的post系列方法中,被广泛使用。
最后,