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用于跨进程发送消息。