Android源码之Handler(三)

publicHandler(Looperlooper,Callbackcallback,booleanasync){

mLooper=looper;

mQueue=looper.mQueue;

[//mQueue=looper.mQueue

这里可以看出,Handler类的MessageQueue成员变量mQueue其实就是Looper内部的MessageQueue变量。

]//mQueue=looper.mQueue

mCallback=callback;

mAsynchronous=async;

}

[//publicHandler(Looperlooper,Callbackcallback,booleanasync)

这个重载版本的构造函数的实现就是初始化Handler的几个成员变量。这几个成员变量的定义如下:

finalMessageQueuemQueue;

finalLoopermLooper;

finalCallbackmCallback;

[//finalCallbackmCallback

mCallback是Handler的Callback.其实Message中会有一个Runnable类型的成员变量callback,这里为什么又要给Handler来定义一个Callback的成员变量呢?

Callback接口定义在Handler内部:

publicinterfaceCallback{

publicbooleanhandleMessage(Messagemsg);

}

]//finalCallbackmCallback

finalbooleanmAsynchronous;

[//finalbooleanmAsynchronous

mAsynchronous表示Hanlder是否是异步的?在我们的认识中,Handler就是按照顺序来处理消息的,这难道不是Handler的作用么?难道还可以异步的处理消息么?

]//finalbooleanmAsynchronous

由此可见,每一个Handler内部维护了一个Looper,而每一个Looper中又维护了一个MessageQueue.

这里我们就来看一下Looper的实现:

]//publicHandler(Looperlooper,Callbackcallback,booleanasync)

Handler的一系列的构造函数中,其实最重要的就是两个:Handler(Callbackcallback,booleanasync)和Handler(Looperlooper,Callbackcallback,booleanasync).

]//Handler的构造函数

当通过Handler构造函数得到了Handler对象之后,会调用obtainMessage来得到一个Message对象.Android推介使用Handler的obtainMessage函数来得到一个Message对象,而不是直接构造一个Message对象,为什么呢?

同样Handler类也提供了一系列的obtainMessage函数,我们看一看obtainMessage函数的实现:

[//obtainMessage函数

publicfinalMessageobtainMessage()

{

returnMessage.obtain(this);

}

publicfinalMessageobtainMessage(intwhat)

{

returnMessage.obtain(this,what);

}

publicfinalMessageobtainMessage(intwhat,Objectobj)

{

returnMessage.obtain(this,what,obj);

}

publicfinalMessageobtainMessage(intwhat,intarg1,intarg2)

{

returnMessage.obtain(this,what,arg1,arg2);

}

publicfinalMessageobtainMessage(intwhat,intarg1,intarg2,Objectobj)

{

returnMessage.obtain(this,what,arg1,arg2,obj);

}

从以上代码也可以看出,Handler的obtainMessage函数其实是调用Message的obtain函数来实现的.我们看一下Message类的obtain函数的实现:

[//Message类的obtain函数

publicstaticMessageobtain(Handlerh){

Messagem=obtain();

m.target=h;

returnm;

}

publicstaticMessageobtain(Handlerh,Runnablecallback){

Messagem=obtain();

m.target=h;

m.callback=callback;

returnm;

}

publicstaticMessageobtain(Handlerh,intwhat){

Messagem=obtain();

m.target=h;

m.what=what;

returnm;

}

publicstaticMessageobtain(Handlerh,intwhat,Objectobj){

Messagem=obtain();

m.target=h;

m.what=what;

m.obj=obj;

returnm;

}

publicstaticMessageobtain(Handlerh,intwhat,intarg1,intarg2){

Messagem=obtain();

m.target=h;

m.what=what;

m.arg1=arg1;

m.arg2=arg2;

returnm;

}

publicstaticMessageobtain(Handlerh,intwhat,

intarg1,intarg2,Objectobj){

Messagem=obtain();

m.target=h;

m.what=what;

m.arg1=arg1;

m.arg2=arg2;

m.obj=obj;

returnm;

}

Message类同样提供了一系列的obtain的重载函数,不过大同小异,都是先调用obtain()函数得到一个Message对象,然后初始化这个Message对象,并返回该Message对象。

我们分析一下Message类的obtain函数的实现:

publicstaticMessageobtain(){

synchronized(sPoolSync){

if(sPool!=null){

Messagem=sPool;

sPool=m.next;

m.next=null;

m.flags=0;//clearin-useflag

sPoolSize--;

returnm;

}

}

[//synchronized(sPoolSync)

上面这段代码就是从缓存中取Message。

其中定义了几个成员变量,分别为:

privatestaticfinalObjectsPoolSync=newObject();

privatestaticMessagesPool;

privatestaticintsPoolSize=0;

这些变量的作用都很明确.注意:这些成员变量都是statics的。

]//synchronized(sPoolSync)

returnnewMessage();

}

[//publicstaticMessageobtain()

Message的obtain函数的作用得到一个Message变量.其实Android为Handler维护了一个Message的缓存,调用obtain函数会首先尝试从缓存中取Message对象,而不是每次就构造一个Message对象。

这就是为什么推荐使用obtain函数来得到一个Message对象的原因。

我们简单来看一下Message的几个重要的成员变量:

publicintwhat;

what成员变量是为了区分不同的Message.

publicintarg1;

publicintarg2;

publicObjectobj;

publicMessengerreplyTo;

publicintsendingUid=-1;

/*package*/staticfinalintFLAG_IN_USE=1<<0;

/*package*/staticfinalintFLAG_ASYNCHRONOUS=1<<1;

/*package*/staticfinalintFLAGS_TO_CLEAR_ON_COPY_FROM=FLAG_IN_USE;

/*package*/intflags;

/*package*/longwhen;

when指示该消息需要被处理的时间戳

/*package*/Bundledata;

/*package*/Handlertarget;

target是最重要的成员变量.Android系统就是通过target找到这个Message所属于的Handler对象,然会调用这个Handler对象的handleMessage函数来处理该消息的

/*package*/Runnablecallback;

/*package*/Messagenext;

privatestaticfinalObjectsPoolSync=newObject();

privatestaticMessagesPool;

privatestaticintsPoolSize=0;

privatestaticfinalintMAX_POOL_SIZE=50;

privatestaticbooleangCheckRecycle=true;

]//publicstaticMessageobtain()

]//Message类的obtain函数

]//obtainMessage函数

经过上面的源码分析,我们可以明白Handler,Looper,MessageQueue和Message个关系了,也理解了这四者是如何配合从而完成Handler机制的。

下面我们分析一下发消息的过程,这主要是通过调用Handler的sendMessage和post函数完成的.Handler提供了一系列的send和post函数:

publicfinalbooleanpost(Runnabler)

{

returnsendMessageDelayed(getPostMessage(r),0);

[//sendMessageDelayed(getPostMessage(r),0)

privatestaticMessagegetPostMessage(Runnabler){

Messagem=Message.obtain();

m.callback=r;

returnm;

}

]//sendMessageDelayed(getPostMessage(r),0)

}

publicfinalbooleanpostAtTime(Runnabler,longuptimeMillis)

{

returnsendMessageAtTime(getPostMessage(r),uptimeMillis);

}

publicfinalbooleanpostAtTime(Runnabler,Objecttoken,longuptimeMillis)

{

returnsendMessageAtTime(getPostMessage(r,token),uptimeMillis);

[//returnsendMessageAtTime(getPostMessage(r,token),uptimeMillis)

privatestaticMessagegetPostMessage(Runnabler,Objecttoken){

Messagem=Message.obtain();

m.obj=token;

m.callback=r;

returnm;

}

]//returnsendMessageAtTime(getPostMessage(r,token),uptimeMillis)

}

publicfinalbooleanpostDelayed(Runnabler,longdelayMillis)

{

returnsendMessageDelayed(getPostMessage(r),delayMillis);

}

publicfinalbooleanpostAtFrontOfQueue(Runnabler)

{

returnsendMessageAtFrontOfQueue(getPostMessage(r));

}

publicfinalbooleansendEmptyMessage(intwhat)

{

returnsendEmptyMessageDelayed(what,0);

}

publicfinalbooleansendEmptyMessageDelayed(intwhat,longdelayMillis){

Messagemsg=Message.obtain();

msg.what=what;

returnsendMessageDelayed(msg,delayMillis);

}

publicfinalbooleansendEmptyMessageAtTime(intwhat,longuptimeMillis){

Messagemsg=Message.obtain();

msg.what=what;

returnsendMessageAtTime(msg,uptimeMillis);

}

publicfinalbooleansendMessageDelayed(Messagemsg,longdelayMillis)

{

if(delayMillis<0){

delayMillis=0;

}

returnsendMessageAtTime(msg,SystemClock.uptimeMillis()+delayMillis);

}

publicfinalbooleansendMessageAtFrontOfQueue(Messagemsg){

MessageQueuequeue=mQueue;

if(queue==null){

RuntimeExceptione=newRuntimeException(

this+"sendMessageAtTime()calledwithnomQueue");

Log.w("Looper",e.getMessage(),e);

returnfalse;

}

returnenqueueMessage(queue,msg,0);

}

publicbooleansendMessageAtTime(Messagemsg,longuptimeMillis){

MessageQueuequeue=mQueue;

if(queue==null){

RuntimeExceptione=newRuntimeException(

this+"sendMessageAtTime()calledwithnomQueue");

Log.w("Looper",e.getMessage(),e);

returnfalse;

}

returnenqueueMessage(queue,msg,uptimeMillis);

}

上面这么多的函数(post用于发送Runnable,send用于发送Message),其实都是很相似的。大致过程都成先得到一个Message,然后调用enqueueMessage函数插入到消息队列中。

我们分析一下enqueueMessage函数的实现:

privatebooleanenqueueMessage(MessageQueuequeue,Messagemsg,longuptimeMillis){

msg.target=this;

if(mAsynchronous){

msg.setAsynchronous(true);

}

returnqueue.enqueueMessage(msg,uptimeMillis);

[//returnqueue.enqueueMessage(msg,uptimeMillis);

这里会调用MessageQueue的enqueueMessage函数来将Message插入到队列中,MessageQueue的enqueueMessage函数的实现如下:

booleanenqueueMessage(Messagemsg,longwhen){

if(msg.target==null){

thrownewIllegalArgumentException("Messagemusthaveatarget.");

}

if(msg.isInUse()){

thrownewIllegalStateException(msg+"Thismessageisalreadyinuse.");

}

synchronized(this){

if(mQuitting){

IllegalStateExceptione=newIllegalStateException(

msg.target+"sendingmessagetoaHandleronadeadthread");

Log.w("MessageQueue",e.getMessage(),e);

msg.recycle();

returnfalse;

}

msg.markInUse();

[//msg.markInUse()

将消息标记为正在使用

voidmarkInUse(){

flags|=FLAG_IN_USE;

}

]//msg.markInUse()

msg.when=when;

Messagep=mMessages;

booleanneedWake;

if(p==null||when==0||when<p.when){

[//if(p==null||when==0||when<p.when)

将消息插入到头部,这时候要唤醒Looper

]//if(p==null||when==0||when<p.when)

msg.next=p;

mMessages=msg;

needWake=mBlocked;

}else{

[//else

将消息插入到队列的中间

]//else

needWake=mBlocked&&p.target==null&&msg.isAsynchronous();

Messageprev;

for(;;){

prev=p;

p=p.next;

if(p==null||when<p.when){

break;

}

if(needWake&&p.isAsynchronous()){

needWake=false;

}

}

msg.next=p;//invariant:p==prev.next

prev.next=msg;

}

//WecanassumemPtr!=0becausemQuittingisfalse.

if(needWake){

nativeWake(mPtr);

[//nativeWake(mPtr)

这里调用nativeWake函数来唤醒Looper,这也是个native函数,实际上调用的是android_os_MessageQueue.cpp中定义的android_os_MessageQueue_nativeWake函数。

android_os_MessageQueue_nativeWake的定义如下:

staticvoidandroid_os_MessageQueue_nativeWake(JNIEnv*env,jclassclazz,jlongptr){

NativeMessageQueue*nativeMessageQueue=reinterpret_cast<NativeMessageQueue*>(ptr);

returnnativeMessageQueue->wake();

[//returnnativeMessageQueue->wake()

这里调用的是NativeMessageQueue的wake函数.

voidNativeMessageQueue::wake(){

mLooper->wake();

[//mLooper->wake()

这里又调用了C++层的wake函数,

voidLooper::wake(){

#ifDEBUG_POLL_AND_WAKE

ALOGD("%p~wake",this);

#endif

ssize_tnWrite;

do{

nWrite=write(mWakeWritePipeFd,"W",1);

}while(nWrite==-1&&errno==EINTR);

if(nWrite!=1){

if(errno!=EAGAIN){

ALOGW("Couldnotwritewakesignal,errno=%d",errno);

}

}

}

可以看到C++层的wake函数就是用mWakeWritePipeFd向管道里发送一个"w"字符,这样就会将epoll_wait函数来唤醒。

]//mLooper->wake()

}

]//returnnativeMessageQueue->wake()

}

]//nativeWake(mPtr)

}

}

returntrue;

}

]//returnqueue.enqueueMessage(msg,uptimeMillis);

}

相关推荐