Loop,Handler,Message的源码解析

一.Looper

1.Loop的概述

主要是讲消息从消息队列中取出来,然后交给与message相对应的Handler处理。

2.Loop的属性

Thread<Local>:为每个线程创建一个副本  就是创建一个Loop在线程里面。       --set(Looper) 创建Looper的副本  ---get()获取Looper

MessageQueue:消息队列  --主要用来存储消息

Thread  ---获取当前的线程

3.Loop的方法

prepare():初始化属性

myLooper():获取当前线程的Looper

loop:循环从消息队列中取出消息交给Handler


二.Handler

1.Handler的概述

将message和runnable发送出去并在未来某个时间处理

将要在不同线程上执行的操作放在队列里面 。 --一个Handler创建需要绑定 当前线程和其消息队列

2.Handler处理message的方法

/**
     * Handle system messages here.
     */
    public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

从上面代码可以看出,Handler处理消息的机制。 先判断message.callback是否为空,不为空则执行message.callback

在判断 执行消息的Handler是否实现了CallBack接口,如果实现了就执行handler.mCallback.handleMessage方法,

我们可以设置返回值来选择是否需要执行handler.handleMessage方法

3.Handler的基本方法

obtainMessage()   --创造一个与Handler相联系的Message(先从消息池中取出,若消息池中没有在生成一个Message)

post()  ---创造一个带有Runnable的Message,并sendMessageDelay(message,0)出去

postAtTime()   --- 创造一个带有Runnable的Message,并执行sendMessageAtTime()

postDelayed()  ---创造一个带有Runnable的Message,并执行sendMessageDelayed()

sendMessage()  ---将消息加到MessageQueue中

sendEmptyMessage()    ---发送一个空消息到messageQueue中

sendMessageAtTime()   ---在某个特定的时间,将消息加入MessageQueue中

sendMessageDelayed()  ---推迟时间,将消息加入到MessageQueue中

猜你喜欢

转载自www.cnblogs.com/xiongbo753/p/9815153.html
今日推荐