异步消息-Handler源码:looper、handler、消息

2019-05-29  本文已影响0人  _爱笑的eyes
-

我们在创建Handler时,就会获取到大量线程的Looper,然后通过Looper获取到消息队列,然后通过Handler发送消息,最后用Looper不断地循环MessageQueue消息队列取出消息之后交给我们的handler处理。

首先看一下handler的源码:

——

handler的构造方法内部,他会去创建一个Looper对象,创建了调用的是myLooper这个方法,然后如果这个Looper为空,就会抛出异常。这个异常大家要关注一下,你创建一个handler,在这个线程内部调用prepare这个方法才会抛出的,也就是说Looper这个方法必须在该线程内部首先被调用。handler的两个作用一个是发送消息一个是处理消息,那么我们用handler发送消息必须在指定的消息队列当中,而我们的消息队列是Looper来管理的,所以说我们希望我们的handler正常工作,就必须在当前线程中指定Looper对象,这是它抛出这个异常的原因。

在创建好Looper之后,他还会创建一个消息队列,而这个消息队列时通过Looper来进行赋值的,所以说它是在Looper内部创建好了之后再赋值给handler内部的成员变量。这时候所做的操作就意味着我们的handler和Looper共用一个消息队列,这时候handler,looper和消息队列这三者捆绑到一起了。我们handler发送消息发送到了消息队列中,所以说sendEmptyMessage,sendEmptyMessageDelayed,这些sendMessage方法最后都会走到enqueueMessage这个方法内。而这个enqueueMessage方法就是将我们发送的消息先加到消息队列当中。

——

这里将我们的message的target属性赋为this,这个this就是我们handler对象。这个操作就意味着将当前的handler对象绑定到我们的message内部的target当中,这样就完成了handler像消息队列存放消息的过程,而messageQueue消息队列到底是什么?消息队列主要包括两种操作:插入 读取。读取操作很简单,同时也会伴随着删除操作。

enqueueMessage向我们的消息队列插入一条消息 读取,在我们的消息队列当中删除

enqueueMessagenext是我们消息队列中最核心的两个方法。

还有,我们不断地在强调MessageQueue消息队列,但是意味着它数据内部结构的实现是通过队列来实现的。它内部是通过一个单链表的数据结构来维护消息队列。因为单链表在插入和删除上比队列更有优势。

上一篇 下一篇

猜你喜欢

热点阅读