我们需要了解4个类:
- handler:处理者,用于发送和接收信息
- massage:消息.里面可以存储消息的许多信息
- looper:循环泵,用于循环取出消息队列中的消息
- MessageQueue(一般不直接接触):消息队列,存储handler发来的消息,先进先出原则(队列)
其实整个机制的过程可以简单概括就是:handler发送一个massage,进入MessageQueue,后依据先进先出取出massage,然后处理massage.
这里面,负责发送消息的是handler,处理消息的也是handler,只需要用回调函数就可以实现,要处理信息的时候,只需要执行该回调即可[handleMessage],然后是如何实现不停的从消息队列中取得massage的呢,这时候就是Looper发挥作用的时候了,Looper中有一个while(true),来实现一直从消息队列中获取massage,获取到之后,只需要使用对应的回调函数,就可以处理消息了.
首先说下looper,实际上每个thread都配有一个looper,也只能有一个,默认状态下的looper是不启动的,activity中已经默认启动,用于一些UI刷新相关工作,如果我们要在我们自己写的thread中启动looper,参照以下代码,执行prepared和loop即可
1 public class LooperThread extends Thread { 2 @Override 3 public void run() { 4 // 初始化looper 5 Looper.prepare(); 6 7 // ...其他处理 8 9 // 开始循环处理消息队列 10 Looper.loop(); 11 } 12 }
我们再来看看handler,handler用于发送和处理消息,要注意的是,new handler之前,需要确保所在thread已经初始化Looper,否则handler无法正确处理消息,原因从上面说的可以看出,没有looper的循环,是无法读取消息队列的
再看massage,massage用于存储需要处理的信息,massage中有许多地方可以储存数据,obj,what等
MessageQueue,简单理解就是一个消息队列.
总结下:
一个thread对应一个looper
一个looper可以对应多个handler
一个looper对应一个MessageQueue
浙公网安备 33010602011771号