相关构件

MessageQueue 是消息队列,Handler 即消费者(handler.postXXX() 或 handler.sendXXX()),也是生产者(handler.handleMessage()),Looper 负责初始化整个消息队列

  • MessageQueue 由 Message 构成的单向链表队列,当没有消息需要 dispatch 的时候,即停止循环 deQueue

  • Message 可分成三中类型的数据:

    • barrier message:用于阻塞同步消息,Message 可以通过 flags 标识为 asynchronous 或 synchronous 消息,barrier 消息之后的所有 synchronous 都会被阻塞,而 asynchronous 则不受影响(barrier message 的 target 为 null)
    • callback message:不带参数,仅带一个 callback 回调消息
    • what message:带参数消息,可以通过 what,data,arg1,arg2,obj带参数

    其他:

    • 通过 message pool 管理 message 的回收和分配
    • FLAG_IN_USE:当 Message 入队(enqueued)或分发(delivered)或被回收到 Message Pool 的时候,flag 都是设置为 true;该 flag 只可以在 Message 初始化生成的时候被清除掉。
      使用场景:在 Message 的 recycle() 方法中,通过 isInUse() 防止回收正在 enqueued 或 delivered 的 message,同时回收后的 message 会被设置了 IN_USE,防止重复回收已回收的 message
    • when:消息应当被分发的时间,可以通过设置该值实现 delay message
  • Looper 通过 ThreadLocal 模式,为每个线程配置唯一的一个 MessageQueue,提供 loop() 方法启动消息循环,quit() 方法结束消息循环

  • Handler 通过持有的 MessageQueue 进行消息收发

消息发送接受流程

handler flowchart.png