Handler对象一创建就跟创建它的线程(或者说线程的消息队列)绑定在一起了。Handler对象将Message对象和Runnable对象加入到线程的消息队列中,当它们从线程队列出来时就执行。
Handler主要有两个作用:(1)、排列将要执行的消息和线程。(2)、将不同线程要执行的动作自动加入到队列中。
Handler使用 post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long), and sendMessageDelayed(Message, long)这几个方法来排列消息。post版本的方法是将线程加入到消息队列中。send版本的方法将Message对象加入到消息队列中,并handleMessage(Message)方法中执行。
如果设置了延迟时间,那么设置的延迟时间将是执行前等待的最短时间。(这一句我不知道是否理解正确了,如有人能对我的理解给出评论,将万分感谢。)
当第一个Handler创建的时候,会通过ThreadLocal创建一个Looper,与UI线程对应,并且这个Looper是唯一的,后面创建Handler对象的时候直接读取这个Looper,当Looper创建的时候会创建一个唯一的MessageQueue。其中Looper用来循环检查消息队列。到这里的时候,刚开始我就疑惑了:那post版本的方法又是什么原理呢?看了下源代码知道了,原来post版本的方法本质上也是sendMessage方式的。