一、先从源码看起:
mHandler.post(new Runnable(){
@Override
public void run(){
//TODO
}
});
其中run方法中写更新UI的代码,其实只是把这个Runnable当成一条消息来处理,下面看源码:
public final boolean post(Runnable r)
{
return sendMessageDelayed(getPostMessage(r),0);
}
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
可以看到,在getPostMessage中,得到了一个Message对象,然后将我们创建的Runable对象作为callback属性,赋值给了此message.
注:产生一个Message对象,可以new ,也可以使用Message.obtain()方法;两者都可以,但是更建议使用obtain方法,因为Message内部维护了一个Message池用于Message的复用,避免使用new 重新分配内存。
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);
}
最终和handler.sendMessage一样,调用了sendMessageAtTime,然后调用了enqueueMessage方法,给msg.target赋值为handler,最终加入MessagQueue.
可以看到,这里msg的callback和target都有值,那么会执行哪个呢?
其实上面已经贴过代码,就是dispatchMessage方法:
public void dispatchMessage(Message msg) {
if(msg.callback !=null) {
handleCallback(msg);
}else{
if(mCallback !=null) {
if(mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
第2行,如果不为null,则执行callback回调,也就是我们的Runnable对象。