Android Handler消息机制源码解析(上)

   主要分析一下Handler,Message,MessageQueue,Looper的源码。

Handler

     Handler可以发送和处理Message,Runnable对象(Message,Runnable都是与此Handler所绑定的Thread的MessageQueue相关);每个Handler对象只能绑定一个Thread,一个Thread都只有一个MessageQueue.当你创建了一个handler对象,它将与当前的Thread绑定,从那时起,它将可以发送Massage和Runnable给这个Thread的MessageQueue,当前这些Message和Runnable从MessageQueue取出时,Handler将处理这些Message和Runnable。

    Handler主要有两个作用:1,延迟或者定时执行一些任务;2,处理别的线程发送过来的一些消息或者Runnable。

    Handler一些常用方法:

post(Runnable),postAtTime(Runnable, long),postDelayed(Runnable,long).

sendEmptyMessage(),sendMessage(Message), sendMessageAtTime(Message,long),sendMessageDelayed(Message,long). 

   当你的app打开之后,会创建进程,然后它的主线程会运行一个messageQueue来管理一些顶级的应用组件(activity,broadcast,etc)和所有的它创建的窗口。你可以创建子线程,通过Handler与主线程进行通信。

   Handler的构造方法有很多,参数从0个到三个都行,最终调用的构造方法如下:

public Handler(Looper looper, Callback callback, boolean async) {
        mLooper = looper;
        mQueue = looper.mQueue;
        mCallback = callback;
        mAsynchronous = async;
    }

Callback如下:

 public interface Callback {
        public boolean handleMessage(Message msg);
    }

从构造方法可以看出,Handler分为同步和异步,与Handler相关的有Looper,MessageQueue,Message

再看Handler的obtainMessage方法:

public final Message obtainMessage()
    {
        return Message.obtain(this);
    }

其实是调用Message的obtain方法:

public static Message obtain() {
        synchronized (sPoolSync) {
            if (sPool != null) {
                Message m = sPool;
                sPool = m.next;
                m.next = null;
                m.flags = 0; // clear in-use flag
                sPoolSize--;
                return m;
            }
        }
        return new Message();
    }

意思就是从Message的消息池中取出最上面的消息。(关于Message会在后面分析到)

sendMessage系列方法:

   其实对于这一系列所有的send和post方法,最终调用的都是MessageQueue的enqueueMessage(msg,uptimeMillis)方法,作用就是插入一条消息到MessageQueue,uptimeMillis代表的是延时执行,如果send或者post方法没有设置延时,则uptimeMillis为0;post方法发送的是一个Runnable对象,其实还是封装成了一个Message发送过去,代码如下:

 private static Message getPostMessage(Runnable r) {
        Message m = Message.obtain();
        m.callback = r;
        return m;
    }


消息的分发:

handler收到消息后会进行判断,然后处理消息,其判断过程如下:

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

private static void handleCallback(Message message) {
        message.callback.run();
    }

  首先会判断Message有没有runnable对象,如果有,则直接执行runnable对象的run()方法,如果没有,则执行handleMessage()方法,handleMessage()是在创建handler对象的时候应该重写的方法,来完成具体的操作。

  本篇主要介绍一下handler中常用的一些方法的原理,关于handler的工作过程,Looper,MessageQueue将会在下篇讲到。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值