关于Handler的post跟View的post方法。

Handler发送消息的过程仅仅是向消息队列中插入了一条消息,MessagQueue的next方法一会返回这条消息给Looper,Looper收到消息后就开始处理了。最终消息由Looper交由Handler处理,即Handler的dispatchMessage方法会被调用。dispatchMessage方法的源码如下:

public void dispatchMessage(Message msg){

if(msg.callback != null){

handleCallback(msg);

}else{

if(mCallback != null){

if(mCallback.handleMessage(msg)){

return ;

}

}

handleMessage(msg);

}

}

首先检查Message的callback是否为null,不为null就通过handleCallback来处理消息。Message的callback是一个Runnable对象,实际上就是Handler的Post方法所传递的Runnable参数。handleCallback的逻辑如下:

private static void handleCallback(Message message){

message.callback.run();

}

其次,检查mCallback是否为null,不为null就调用mCallback的handleMessage方法来处理消息。Callback是一个接口,它的定义如下:

public interface Callback{

public boolean handleMessage(Message msg);

}

那么Callback的意义是什么呢?

它可以用来创建一个Handler的实例但不需要派生Handler的子类。平时我们创建Handler的最常见的方法就是派生一个Handler的子类,重写handlerMessage方法。而Callback给我们提供了另一种使用Handler的方式,当我们不想派生Handler的子类的时候,可以用Callback构造Handler。

那么view.post(Runnable r)是怎么工作的呢,源码如下:

public boolean post(Runnable action) {

final AttachInfo attachInfo = mAttachInfo;

if (attachInfo != null) {

return attachInfo.mHandler.post(action);

}

// Assume that post will succeed later

ViewRootImpl.getRunQueue().post(action);

return true;

}

由此可见,view获取到关联线程(即UI线程,因为只有UI线程才能创建view)的handler,然后调用该handler的post方法,即把这个任务封装成一个消息post到主线程的消息队列中,然后等待执行。

推荐阅读更多精彩内容