Handler 机制 笔记

主要有5个类
Handler 负责发消息和处理消息
Message 消息对象
MessageQueue 消息队列,负责存储消息对象 本质是优先队列
Looper 消息轮询器 负责从MQ中取消息并传给Handler,让其处理
ThreadLocal 保存Looper

发送消息

    Handler 使用 sendMessage() 方法发送消息,
    最后调用到 MessageQueue 的 enqueueMessage()方法,向队列里添加消息
    这里有个关键点 Message 有个值 when(when = 当前时间戳+delay),添加消息的时候会将when的大小当做优先级将MessageQueue 重新排列,

轮训消息

    Looper.loop();

接收并处理消息

    Looper 会从 MessageQueue 中取出消息
    然后会发现有这个逻辑 msg.target.dispatchMessage(msg); 其中 target 就是Handler
    Handler 的 dispatchMessage() 方法 最终调用的是 handleMessage() 方法

首先创建handler的时候必须要有Looper, 但是activity中默认已经创建了looper, 但是新开的线程,要想初始化handler,就必须调用

Looper.parepare()去创建一个,初始化handler对象之后调用, Looper.loop()处理数据. Handler跟其绑定的Looper 在同一个线程

 

 

handler的handleMessage会在dispatchMesage() 中执行, 而dispatchMessage()会在looper的loop()方法里调用;

在loop()方法中会先获取Looper对象

final Looper me = myLooper()

Looper会由静态, 不可变 ThreadLocal管理, ThreadLocal 内部有个 ThreadLocalMap 来存储对象 但是是非静态的 所以每个线程都各有一份.

Message 从MessageQueue中取出, 而MessageQueue由looper管理, handler对象保存在Message中

总结:一个线程中可以创建多个Handler,只能存在一个Looper,只有一个message queue,通过targer去判断哪个Handler去处理消息 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章