Handler给自己发送了一条消息,只是消息经过了消息队列以及Looper,最后才到Handler的handleMessage方法里

Handler的工作原理
Handler主要包括消息的发送和接收,也就是相当于Handler给自己发送了一条消息,只是消息经过了消息队列以及Looper,最后才到Handler的handleMessage方法里。
=============================== ========================= ============================ ================================
Handler的消息的发送
主要由post一系列方法以及send的一系列方法来实现,post的一系列方法最终都是通过send的一系列方法来实现的。而send一系列方法最后都是通过sendMessageAtTime方法来实现的。
sendMessageAtTime代码如下:

public boolean sendMessageAtTime(Message msg, long uptimeMillis) {
MessageQueue queue = mQueue;
if (queue == null) {
RuntimeException e = new RuntimeException(
this + " sendMessageAtTime() called with no mQueue");
Log.w("Looper", e.getMessage(), e);
return false;
}
return enqueueMessage(queue, msg, uptimeMillis);
}

private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}

从上面代码可以看出,发送消息其实就是往消息队列里面插入一个消息。当Handler把消息插入到消息队列里后,MessageQueue就通过next方法把这个消息返回给Looper,而Looper则通过
loop方法调用Handler的dispatchMessage方法(msg.target.dispatchMessage(msg);)。来看看dispatchMessage方法的实现过程:

public void dispatchMessage(Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}

private static void handleCallback(Message message) {
message.callback.run();
}

首先就是判断Message对象是否有callback对象,如果有,则调用callback的run方法,就是下面的这个方法,callback其实是一个实现了Runnable的对象,实际上是通过Handler的post方法
所传递的。如果Message对象没有callback对象,则跑到else代码块里,mCallback的handlerMessage方法和后面的那个handlerMessage方法其实是一样的,第一个是通过实现mCallback接口
来得到的一个方法,而第二个是Handler的方法,两个方法都是空实现,当处理消息时都要重写这个两个方法中的一个,只是创建Handler时的构造方法不一样而已。

 

posted @ 2018-03-14 13:28  sky20080101  阅读(75)  评论(0)    收藏  举报