为了更好地理解Handler的工作原理,下面先介绍一下与Handler一起工作的几个组件.
> Message: Handler接受和处理的消息对象.
>Looper :每个线程只能拥有一个Looper.他的loop()方法负责读取MessageQueue中的消息,读到消息之后把消息发送给该小小的Handler进行处理.
>MessageQueue:消息队列,他采用先进先出的方式管理Message.程序创建Looper
对象时,会在它的构造器中创建MessageQueue对象.Looper的构造器代码如下:
private Looper()
{
mQueue=new MessageQueue();
mRun=true;
mThread=Thread.currentThread();
}
该构造器采private修饰,表明程序员无法通过构造器创建Looper对象.从上面的代码不难看出,程序在初始化Looper时会创建一个与之关联的MessageQueue,这个MessageQueue就负责管理消息.
> Handler:它的作用有两个-----发送消息和处理消息,程序使用Handler发送消息,由Handler发送的消息必须被送到指定的MessageQueue.也就是说,如果希望Handler正常工作,必须在当前啊线程中有一个MessageQueue;否则消息就没有MessageQueue进行储存了.不过MessageQueue是由Looper负责管理的,也就是说,如果希望Handler正常工作,必须在当前线程中由一个Looper对象.为了保证当前线程中由Looper对象,可以分如下两种情况处理.
>在主UI线程中,系统已经初始化一个Looper对象,因此程序员直接创建Handler即可,然后就可以通过Handler啦i发送,处理消息.
>程序员自己启动的子线程,必须自己创建一个Looper对象,并启动它.创建Looper对象调用他的prepare()方法即可.
归纳起来,Looper,MessageQueue,Handler各自的作用如下.
>Looper:每个线程只有一个Looper,他负责管理MEssageQueue,会不断从MeaasgeQueue中读取消息,并将消息分给对应的Handler处理.
>MessageQueue:由Looper负责管理.采用先进先出的方式来管理Message.
>Handler:它能把消息发送给Looper管理MessageQueue,并负责处理Looper分给他的消息.
在线程中处理Handler的步骤如下.
1.调用Looper的prepare()方法为当前线程创建Looper对象,创建Looper对象时,他的构造器会创建与之配套的MessageQueue.
2.有了Looper之后,创建Handler子类的实例,重写handleMessage()方法,该犯法负责处理来自其他线程的消息.
3,调用Looper的loop()方法启动Looper.