AndroidHandler,Looper,Message深入分析_第1頁
AndroidHandler,Looper,Message深入分析_第2頁
AndroidHandler,Looper,Message深入分析_第3頁
AndroidHandler,Looper,Message深入分析_第4頁
AndroidHandler,Looper,Message深入分析_第5頁
已閱讀5頁,還剩2頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

1、在網(wǎng)上有許多資料對這三者關(guān)系的分析,但都比較籠統(tǒng)不夠細(xì)致入微以下是自己深入源碼分析其結(jié)果.Handler源碼:publicclassHandlerprivatestaticfinalbooleanFIND_POTENTIAL_LEAKS=false;privatestaticfinalStringTAG="Handler"publicinterfaceCallbackpublicbooleanhandleMessage(Messagemsg);finalMessageQueuemQueuefinalLoopermLooper;finalCallbackmCallback;I

2、MessengermMessenger;/*Subclassesmustimplementthistoreceivemessages.*/publicvoidhandleMessage(Messagemsg)publicHandler()if(FIND_POTENTIAL_LEAKSfinalClass<?extendsHandler>klass=getClass();if(klass.isAnonymousClass()|klass.isMemberClass()|klass.isLocalClass()&&(klass.getModifiers()&Mo

3、difier.STATIC)=0)Log.w(TAG"ThefollowingHandlerclassshouldbestaticorleaksmightoccur:"+klass.getCanonicalName();mLooper=Looper.myLooper();if(mLooper=null)thrownewRuntimeException("Can'tcreatehandlerinsidethreadthathasnotcalledLooper.prepare()");mQueue=mLooper.mQueue;mCallback=n

4、ull;/*Handlesystemmessageshere.7publicvoiddispatchMessage(Messagemsg)if(msg.callback!=null)handleCallback(msg);elseif(mCallback!=null)if(mCallback.handleMessage(msg)return;handleMessage(msg);publicHandler()if(FIND_POTENTIAL_LEAKSfinalClass<?extendsHandler>klass=getClass();if(klass.isAnonymousC

5、lass()|klass.isMemberClass()|klass.isLocalClass()&&(klass.getModifiers()&Modifier.STATIC)=0)Log.w(TAG"ThefollowingHandlerclassshouldbestaticorleaksmightoccur:"+klass.getCanonicalName();mLooper=Looper.myLooper();if(mLooper=null)thrownewRuntimeException("Can'tcreatehandl

6、erinsidethreadthathasnotcalledLooper.prepare()");mQueue=mLooper.mQueue;mCallback=null;publicbooleansendMessageAtTime(Messagemsg,longuptimeMillis)booleansent=false;MessageQueuequeue=mQueueif(queue!=null)msg.target=this;sent=queue.enqueueMessage(msg,uptimeMillis);)elseRuntimeExceptione=newRuntime

7、Exception(this+"sendMessageAtTime()calledwithnomQueue");Log.w("Looper",e.getMessage(),e);)returnsent;)從源碼分析可以看出:handler在無參數(shù)的構(gòu)造方法中調(diào)用Looper.myLooper()方法,里面就是從當(dāng)前線程里面獲取一個Looper對象,如果沒有則創(chuàng)建.這樣對Looper就進(jìn)行初始化,初始化Looper的同時一并初始化MessageQueue,并且從中得到looper的MessageQueue.可以看出Handler就是Looper和Messa

8、geQueue的管理者和調(diào)度者.其中最重要的是:sendMessageAtTime(Messagemsg,longuptimeMillis)這個方法,當(dāng)你往Handler中發(fā)送Message消息的時候,從代碼看出他自己并不去處理Message,而是交給了MessageQueue.由以下從這段代碼來處理:queue.enqueueMessage(msg,uptimeMillis),其具體實現(xiàn)要看下面的對MessageQueue的分析Looper結(jié)構(gòu)關(guān)聯(lián)的內(nèi)容:Looper源碼:publicclassLooperprivatestaticfinalbooleanDEBUGfalse;private

9、staticfinalbooleanlocalLOGV=DEBUG?Config.LOGD:Config.LOGV/sThreadLocal.get()willreturnnullunlessyou'vecalledprepare().privatestaticfinalThreadLocalsThreadLocal=newThreadLocal();finalMessageQueuemQueuevolatilebooleanmRunThreadmThread;privatePrintermLogging=null;privatestaticLoopermMainLooper=null

10、;publicstaticfinalvoidprepare。if(sThreadLocal.get()!=null)thrownewRuntimeException("OnlyoneLoopermaybecreatedperthread"sThreadLocalpublicstaticfinalLooperme=);.set(newLooper();voidloop()myLooper();MessageQueuequeue=me.while(true)Messagemsg=queue.next();mQueue/mightblockif(msg!=null)if(msg.

11、target=return;null)if(me.mLogging!=null)me.mLogging.println(>>>>>Dispatchingto"+msg.callback+);msg.target.dispatchMessage(msg);+msg.target+msg.whatif(me.mLogging!=null)me.mLogging.println("<<<<<Finishedto+msg.callback);msg.recycle();從源碼可以看出Looper封裝的信息:+msg.tar

12、get+Looper實質(zhì)上是對當(dāng)前線程,ThreadLocal,MessageQueue的封裝,也就是負(fù)責(zé)在多線程之間傳遞消息的一個循環(huán)器.當(dāng)你往Handler中添加消息的時候則,里面這個方法:publicstaticfinalvoidloop()死循環(huán)的方法就會被系統(tǒng)調(diào)用,之后的功能代碼是:msg.target.dispatchMessage(msg),則從MessageQueue中得到一個Message(msg),之后調(diào)用Handler的dispatchMessage(msg),這個方法內(nèi)部實際調(diào)用的就是Handler.handleMessage(msg)方法,這個就是我們在activit

13、y要重寫的方法,所以我們就能夠得到其他子線程傳遞的Message了.Message的源碼分析:publicfinalclassMessageimplementsParcelablepublicintwhat;publicpublicpublicpublicintarg1;intarg2;Objectobj;MessengerreplyTo;BundleHandlerRunnableMessageprivateprivateprivateprivatedata;target;callback;next;staticstaticstaticstaticObjectmPoolSync=newObje

14、ct();MessagemPool;intmPoolSize=0;finalintMAX_POOL_SIZE=10;longwhen;When:向Handler發(fā)送Message生成的時間Data:在Bundler對象上綁定要線程中傳遞的數(shù)據(jù)Next:當(dāng)前Message對一下個Message的引用Handler:處理當(dāng)前Message的Handler對象.mPool:通過字面理解可能叫他Message池,但是通過分析應(yīng)該叫有下一個Message引用的Message鏈更加適合.其中Message.obtain(),通過源碼分析就是獲取斷掉Message鏈關(guān)系的第一個Message.Message

15、QueuepublicclassMessageQueueMessagemMessages;privatefinalArrayListmIdleHandlers=newArrayList();privatebooleanmQuiting=false;booleanmQuitAllowed=true;publicstaticinterfaceIdleHandlerbooleanqueueIdle();publicfinalvoidaddIdleHandler(IdleHandlerhandler)if(handler=null)thrownewNullPointerException("

16、Can'taddanullIdleHandler");synchronized(this)mIdleHandlers.add(handler);_finalbooleanenqueueMessage(Messagemsg,longwhen)if(msg.when!=0)thrownewAndroidRuntimeException(msg+"Thismessageisalreadyinuse.");)if(msg.target=null&&!mQuitAllowed)thrownewRuntimeException("Mainth

17、readnotallowedtoquit");)synchronized(this)if(mQuiting)RuntimeExceptione=newRuntimeException(msg.target+"sendingmessagetoaHandleronadeadthread");Log.w("MessageQueue",e.getMessage(),e);returnfalse;elseif(msg.target=null)mQuiting=true;msg.when=when;Log.d("MessageQueue"

18、;,"Enqueing:"+msg);Messagep=mMessages;if(p=null|when=0|when<p.when)msg.next=p;mMessages=msg;this.notify();elseMessageprev=null;while(p!=null&&p.when<=when)prev=p;p=p.next;msg.next=prev.next;prev.next=msg;this.notify();returntruemMessages:為當(dāng)前序列的第一個Message,通過源碼分析MessageQueue并不是對許多Message之間的關(guān)系維護,這樣也許可以省去很多事把,而Message之間的關(guān)系則統(tǒng)統(tǒng)丟給了Message自己去維護,這個可以從對Message源碼分析可以理解.mIdleHandler:保存的是一系列的h

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論