关于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到主线程的消息队列中,然后等待执行。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值