7.3 第二步:创建消息处理器并发送消息

Handler是Looper线程的消息处理器,创建并初始化Handler是Looper线程运行过程中的关键步骤之一。Looper线程是由消息驱动的,Message便是消息的载体。Handler承担了消息驱动机制的发送消息和处理消息两部分工作。本节分析Handler和Message的创建和初始化过程。

7.3.1 Handler的创建和初始化

Handler定义于frameworks/base/core/java/android/os/Handler.java中,其定义了四个不同的构造函数用于初始化Handler,这里以默认构造函数为例分析Handler的初始化,代码如下:


public class Handler{

public Handler(){

if(FIND_POTENTIAL_LEAKS){//调试接口,默认为false

final Class<?extends Handler>klass=getClass();

if((klass.isAnonymousClass()||klass.isMemberClass()||

klass.isLocalClass())&&

(klass.getModifiers()&Modifier.STATIC)==0){

Log.w(TAG,"The following Handler class should be static

or leaks might occur:"+klass.getCanonicalName());

}

}

//myLooper用于返回当前线程中Java层的Looper对象

mLooper=Looper.myLooper();

if(mLooper==null){//必须调用Looper.prepare()后才能使用Looper

throw new RuntimeException(

"Can't create handler inside thread

that has not called Looper.prepare()");

}

mQueue=mLooper.mQueue;//Looper对象中存储的MessageQueue

mCallback=null;//默认构造函数不指定回调函数

}

//以下是Handler中定义的成员变量

final MessageQueue mQueue;//存储Java层Looper对象内部的MessageQueue

final Looper mLooper;//存储Java层的Looper对象

final Callback mCallback;//回调函数,处理消息

IMessenger mMessenger;//用于跨进程的消息发送

}


创建Handler对象的过程并没有特别之处,其所作的工作是将之前在本线程中创建的Looper和MessageQueue关联到其成员变量中,这样,Looper、MessageQueue和Handler就连接到一起了。Handler的成员变量mMessenger用于跨进程发送消息。