




版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 期貨市場品牌建設(shè)與維護服務(wù)考核試卷
- 木材加工行業(yè)人才培養(yǎng)計劃考核試卷
- 攝影器材行業(yè)市場動態(tài)監(jiān)測與競爭情報分析考核試卷
- 辦公室員工職業(yè)發(fā)展與培訓(xùn)體系建設(shè)案例考核試卷
- 天然氣開采項目財務(wù)管理與成本控制考核試卷
- 固體飲料的無添加與天然成分趨勢考核試卷
- 木材貿(mào)易風(fēng)險管理與防范考核試卷
- 搪瓷衛(wèi)生潔具的顧客滿意度調(diào)查考核試卷
- 放射性金屬礦選礦實驗方法與技術(shù)考核試卷
- 鋼板出售轉(zhuǎn)讓合同范本
- 法拉利加利福尼亞california維修手冊、電路圖-高檔車原廠
- 汽機組拆除方案
- 脊柱損傷搬運(共18張)課件
- 新教材人教版高中化學(xué)選擇性必修3全冊各章節(jié)知識點考點重點難點歸納總結(jié)
- 生產(chǎn)組織供應(yīng)能力說明
- 碳酸丙烯酯法脫碳工藝工程設(shè)計
- 藥劑學(xué)-名詞解釋
- 口語課件Unit 1 Ways of Traveling Possibility and Impossibility
- 城市支路施工組織設(shè)計
- 耐堿玻纖網(wǎng)格布檢測報告
- 20米往返跑教案 (2)
評論
0/150
提交評論