Handler的存在意义

一、Handler的实现

  • 创建:获取当前线程,通过线程的ThreadLocalMap获取Looper,关联Looper和Looper里面的MessageQueue。
  • 投递:每次封装成Message对象投递进MessageQueue。
  • 处理:这部分工作由Looper完成,它不断从MessageQueue中取Message。Message中有Callback就执行,没有就调用Message中的target.dispatchMessage(Message)方法投递给这个消息产生的Handler。

二、Handler的作用

1.切换线程,线程间通信

开发中经常使用到这个功能。

2.将事件或任务序列化

序列化最大的好处就是顺序执行,便于维护,不会出现任务错乱的情况,并且在单线程内不需要并发。以下举一个经典的例子:

  • 为什么我们可以使用View.post(Runnable)这种方式获取一个View的实际宽高?
  • View的宽高至少要通过Measure方法执行完之后才能获取,并且有可能在Layout的时候被触发重新测量。所以只有View真正显示的时候获取的宽高是最准确的。
  • View的绘制流程是借助Handler的事件处理机制。
  • View.post(Runnable)将这个任务投递到串行队列中去,因此当这个任务被执行时,前面的View绘制任务已经执行完,这时候调用View.getWidth(),View.getHeight()肯定是有值并且准确的。