true,则直接返回,否则接着调用Handler自己的handleMessage方法,其默认实现是do nothing,如果你
是extends Handler,那么你应该在你的子类中为handleMessage提供自己的实现。
5.一系列obtainMessage
public final Message obtainMessage()
{
return Message.obtain(this);
}
public final Message obtainMessage(int what)
{
return Message.obtain(this, what);
}
public final Message obtainMessage(int what, int arg1, int arg2, Object obj)
{
return Message.obtain(this, what, arg1, arg2, obj);
}
从上面可以看出来还是调用的Message的obtain方法,来构造message。
6.一系列postXXX方法:
/**
* Causes the Runnable r to be added to the message queue.
* The runnable will be run on the thread to which this handler is
* attached.
*
* @param r The Runnable that will be executed.
*
* @return Returns true if the Runnable was successfully placed in to the
* message queue. Returns false on failure, usually because the
* looper processing the message queue is exiting.
*/
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r), 0);
}
public final boolean postAtTime(Runnable r, long uptimeMillis)
{
return sendMessageAtTime(getPostMessage(r), uptimeMillis);
}
public final boolean postAtTime(Runnable r, Object token, long uptimeMillis)
{
return sendMessageAtTime(getPostMessage(r, token), uptimeMillis);
}
public final boolean postDelayed(Runnable r, long delayMillis)
{
return sendMessageDelayed(getPostMessage(r), delayMillis);
}
public final boolean postAtFrontOfQueue(Runnable r)
{
return sendMessageAtFrontOfQueue(getPostMessage(r));
}
上面方法的作用就是:把Runnable发送到消息队列,执行的时候实行Runnable的run方法。。
下面看一系列sendXXX方法,和上边对应的。。。
//把消息入队
public final boolean sendMessageDelayed(Message msg, long delayMillis)
{
if (delayMillis < 0) {
delayMillis = 0;
}
return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis);
}
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);
}
public final boolean sendEmptyMessage(int what)
{
return sendEmptyMessageDelayed(what, 0);
上面所有的postXXX,sendXXX方法最后都会调用这个方法:enqueueMessage
private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
msg.target = this;
if (mAsynchronous) {
msg.setAsynchronous(true);
}
return queue.enqueueMessage(msg, uptimeMillis);
}
最后调用queue的enqueueMessage方法把msg入队,对这个方法不了解的,可以看前边的MessageQueue源码解析。
SystemClock.uptimeMillis(),就是表示系统开机到当前的时间总数,如果有延迟,就加上延迟时间,分析到现在,我们也能发现,postDelayed不是延迟多少秒发送消息,这个消息是直接发送给队列的,不过在MessaegQueue中,消息按时间排放的,不到时间不会把它取出来,所以应该说延迟多少秒取出消息更合适。。
至于上边的getPostMessage(r)就是把r设置给callback。
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
removeCallbacks:
调用MQ的removeMessages方法。就是移出messageQueue中所有满足条件的message,当然前提是消息还没取走。
/**
* Remove any pending posts of Runnable r that are in the message queue.
*/
public final void removeCallbacks(Runnable r)
{
mQueue.removeMessages(this, r, null);
}
/**
* Remove any pending posts of Runnable <var>r</var> wit