很久之前就说过要写这篇博客的,但是由于学习上过于紧张,一直空写。人就是这样,总会被这样那样的事情左右着。希望以后能做到一周一到两篇关于所学知识的总结或理解吧。治愈懒癌症,做一个有计划有条理的人。
在我看来Handler、Looper、MessageQueen、Message分别代表的是老板、秘书、日程表、每个日程。日程表(MessageQueen)负责存储将要执行的日程(Message),而秘书(Looper)的任务就是一直查看着日程表(MessageQueen),看有没有需要老板执行的日程(Message)。如果有的话,就取出来交给老板去处理。于是很容易得出如下的结论和概括:
Message: Handler接收和处理的消息对象
MessageQueen: 存储消息对象的队列
Looper: 负责读取MessageQueen中的消息,读到消息之后就把消息交给Handler去处理。
Handler:发送消息和处理消息
首先应该知道的是,一个线程只能拥有一个Looper,如果希望Handler可以很好地正常地工作,那么在Handler所在的线程当中必须要有Looper和MessageQueen这两个对象。这很容易理解,老板要做到有效率有条理的工作,离不开秘书对日程表的完美安排。可能有人会问,我平时在主线程中使用Handler,也没有看到要创建Looper和MessageQueen对象啊。其实那是因为系统默认地给主线程初始化了一个Looper对象,因此呢你没有看到什么报错的提示,倘若你在子线程中创建你的Handler,而没有创建Looper对象,那就会报如下的错误。下面是一段Looper的源代码的截图:可以看出如果没有Looper,则会抛出一个异常。
那么Looper是如何初始化的呢?其实很简单,就像抛出的异常那样,直接Looper.prepare()即可。我们来看一下这个方法的源码片段。
下面给出源码中的一段示例用法:
可以看到Handler初始化之前必须调用prepare方法,初始化完成之后,就调用looper方法,一直不停地向消息队列中获取消息。