1.消息机制概述
Android的消息机制主要是指Handler的运行机制.在Handler的背后,还需要Looper和MessageQueen的支持. MessageQueen顾名思义,就是消息队列,它的内部存放是一组消息.它仅仅负责消息的入队出队,并不负责怎么去处理消息.消息怎么去处理还要依靠Looper来完成.Looper会一直监听是否有新的消息,有的话就去处理消息,没有就会一直阻塞.
Handler创建完成后,这时候就需要Looper和MessageQueen一起协作完成消息处理工作了.首先,Handler通过post()方法将Runnable投递到Looper去处理,或者通过send()方法发送消息去Looper中处理.当然,这里的post()方法也是通过send()方法实现的.当Handler的send()方法被调用的时候,他会调用MessageQueen的enqueueMessage()将消息放入队里中,然后Looper发现新消息来了,就会去处理这个消息.注意,Looper会运行在创建Handler的那个线程中,这样,Handler中的业务就会切换到了创建时候的线程中去了.
2.MessageQueen工作原理分析
MessageQueen比较简单,主要就是包括enqueueMessage()
和next();
enqueueMessage():将收到的消息加入到队列中去,对消息对先来先服务处理
next():将消息出队,交于Looper处理
3.Looper工作原理
通过Looper.prepare()可以为当前的线程去创建一个Looper对象,与之对应的是一个Looper.prepareMainLooper()
,通过名字也可以知道他是做什么的-专门为ActivityThread(也就是UI线程)去创建Looper.还有一个Looper.getMainLooper()方法获取这个Looper.这些仅仅是创建一个Looper,并没有进入监听MesageQueen状态中去,我们还应该调用Looper.loop()去开启他. Looper也是可以退出的,有quit()和quitSafely(),区别就在于quit()会直接退出,而quitSafely()只是设定一个标记,在消息全部处理完毕后就会退出.Looper退出后,Handler的send方法发送消息会得到一个true,表示消息发送失败. 在子线程中手动创建的Looper,在完成所有的工作后要将其退出,不然子线程会一直处于等待状态.
4.Handler的工作原理
Handler的工作包括消息的发送和接收过程.发送消息的方法主要有post()和send()这两个系列,他们都包括延时等的一些重载函数可以供我们使用.Handler发送消息仅仅就是向MessageQueen里面插入了一条消息而已. MessageQueen发现Message后通过next()方法将消息传递给Looper,Looper最后在调用Handler里的dispatchMessage()方法,这时候Handler就会进入消息处理阶段了,而这时候会切换到创建Handler的线程中去了. 处理消息就是通过handleMessage()回调方法,处理数据. 这里我们还要说明一点就是,Handler的构造方法里面有这样的参数Looper,也就是说我们可以在创建Handler的时候指定一个Looper给他.
总结:
当我们调用handler.sendMessage(msg)方法发送一个Message时,实际上这个Message是发送到与当前线程绑定的一个MessageQueue中,然后与当前线程绑定的Looper将会不断的从MessageQueue中取出新的Message,调用msg.target.dispathMessage(msg)方法将消息分发到与Message绑定的handler.handleMessage()方法中。
一个Thread对应多个Handler
一个Thread对应一个Looper和MessageQueue
Handler与Thread共享Looper和MessageQueue
Message只是消息的载体,将会被发送到与线程绑定的唯一的MessageQueue中,并且被与线程绑定的唯一的Looper分发,被与其自身绑定的Handler消费。
附录
以后每个知识点的实践学习代码会上传到我的GitHub,欢迎大家一起学习-.-~