美文网首页Android
关于Handler的post跟View的post方法。

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

作者: 铜角大王 | 来源:发表于2017-08-10 15:50 被阅读0次

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

    相关文章

      网友评论

        本文标题:关于Handler的post跟View的post方法。

        本文链接:https://www.haomeiwen.com/subject/vuvhrxtx.html