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到主线程的消息队列中,然后等待执行。
网友评论