实现一个Handler-Looper框架

Handler的核心能力

  • 线程间通信
  • 延迟任务执行

sendMessageDelayed(Message msg, long delay)

postDelayed(Runnable r, long delay)

Looper的核心能力

  • Looper是线程特有的,所以要有ThreadLocal
  • 包含MessageQueue
  • loop()方法,在死循环中获取消息队列中的消息,分发给handler处理

MessageQueue的核心能力

  • 持有消息(链表)
  • 消息按时间排序(优先队列)
  • 队列为空的时候阻塞读取(阻塞队列)
  • 头节点有延时可以定时阻塞(延时阻塞队列)

使用DelayQueue

Message

仿造Android的message


类结构

DelayQueue

  • 实现BlockingQueue接口(实现阻塞功能)

  • 有PriorityQueue对象(可以优先排序)

    DelayQueue的阻塞机制:通过condition.await方法

存在的问题

没有实现remove的方法


为什么Android不直接使用DelayQueue作为消息队列

  • DelayQueue没有提供合适的remove机制
  • 更大的自由度,可以定制许多功能,特别是与Native层结合
  • Android的MessageQueue可以针对单线程读取的场景做优化,只有插入队列的时候加锁,而读取的时候不用加锁;DelayQueue读写都加锁