我们需要了解4个类:

  1. handler:处理者,用于发送和接收信息
  2. massage:消息.里面可以存储消息的许多信息
  3. looper:循环泵,用于循环取出消息队列中的消息
  4. 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