Android深入--Handler机制简析(Handler、Looper、MessageQueue)

来源:互联网 发布:java 多线程 书籍 编辑:程序博客网 时间:2024/06/07 23:09

背景

首先,我们都知道,在安卓中,不可以在子线程中更新UI,如果希望在子线程执行过程中更新UI,则必须使用Handler。那么,什么是Handler呢?Handler是否只是用于更新UI呢?

Handler更新UI原理

上述的子线程使用Handler更新UI,为什么就可以呢?答案是更新UI的Handler是在主线程中。耗时操作交给了子线程,子线程耗时操作结束后,只需要发送一个消息给主线程,主线程就可以进行UI的更新了,这样设计是为了避免卡顿及各种问题的产生。试想如果多个子线程同时更新同一个UI,那将会有多混乱···
在主线程中处理消子线程发送来的消息的,就是Handler。

Handler机制

首先,介绍几个名字:

公司(Handler所在线程):
- Handler:我叫他执行者(公司职员)
- Looper:本意为循环者,我给它起名叫指挥者(管理层领导)
- MessageQueue:消息队列(任务清单)
客户(发送消息的线程)

现在,我们就以一个公司的运行机制来解释解释Handler的机制吧。当客户(发送消息的线程)希望让公司(某线程)去完成一些任务是,会提出一个需求给公司(发送消息)。这时候,公司的任务清单(MessageQueue)中就对多出了这个任务的编号或者名称(发送的消息内容)。而公司的领导在不断的循环查看着任务清单(Looper不断循环查看MessageQueue),如果任务清单中有任务(MessageQueue中有消息),就把这个任务派发给公司职员(Handler)去执行,并且在任务清单中把这个任务划掉(MessageQueue中的对应消息被消费)。

上述情况下如果任务清单中有很多个任务的时候,当职员(Handler)在执行任务的时候,就不能投入另外一个任务,所以管理者会在职员执行完任务后,马上将另一个任务分配给它。这也不难理解,职员只有一个,不能同时做多个事情(Handler在一个线程中),所以这是一个有顺序的过程(同步执行的)。

再将子线程更新UI的案例代入上述情景中,用户(子线程)在使用公司产品的过程中(耗时操作后),要求公司(主线程)去完成自己的新任务(更新UI),此时就会将任务发送到公司的任务清单中(Handler的sendMessage等发送消息的方法)此时公司领导在循环查看任务清单的时候发现有了一条任务,此时将这个任务分配给职员去完成。

从上述的机制中可以看出,Handler不仅可以用于更新UI,更可以当做一个队列去使用它。并且这个队列可以执行在单独的线程中,队列中等待的任务也可以随时清掉。当然,在主线程中的Looper不需要我们维护,然而子线程中使用Handler的话,则需要手动去开启Looper的循环。

阅读全文
0 0
原创粉丝点击