資源描述:
《優(yōu)就業(yè)android教程-深入理解android異步消息處理機(jī)制》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在工程資料-天天文庫。
1、優(yōu)就業(yè)Android教程-深入理解Android異步消息處理機(jī)制-、概述Android中的異步消息處理主要分為!U個(gè)咅P分組成,Message、Hndler、MessageQueue和Looper。其關(guān)系如下所示:MessageQueuenextnextMessageMessageMessagexte1.Message是線程之間傳遞的消息,它可以在內(nèi)部攜帶少量信息,用于在不同線程之間交換數(shù)據(jù)2.MessageQueue是消息隊(duì)列,它主要用于存放所有由Handler發(fā)送過來的消息,這部分消息會(huì)一直在消息隊(duì)列中,等待被處理。每個(gè)線程中只會(huì)有一個(gè)Messag
2、eQueue對(duì)象。2.Handler是處理者,它主要用于發(fā)送和處理消息。發(fā)送消息一般使用handler的sendMessage()方法,處理消息會(huì)調(diào)用handleMessage()方法。3.Looper是每個(gè)線程中MessageQueue的管家,調(diào)用loop()方法后,就會(huì)進(jìn)入到一個(gè)無限循環(huán)當(dāng)中,然后每當(dāng)發(fā)現(xiàn)MessageQueue中存在一條消息,就會(huì)將其取出,并傳遞到handleMessage()方法當(dāng)中。每個(gè)線程中也只會(huì)有一個(gè)Looper對(duì)象。二、詳細(xì)介紹1、Looper對(duì)于Looper主要是prepare()和loop()兩個(gè)方法。publics
3、taticfinalvoidprepareO{if(sThreadLocal.getO!=null){thrownewRuntimeException("OnlyoneLoopermaybecreatedperthread");sThreadLocal.set(newLooper(true));}sThreadLocal是一個(gè)ThreadLocal對(duì)象,可以在一個(gè)線程中存儲(chǔ)變量。Looper就是存儲(chǔ)在sThreadLocal里面。這個(gè)方法被調(diào)用后,首先會(huì)判斷當(dāng)前線程里面有沒有Looper對(duì)象,如果沒有就會(huì)創(chuàng)建一個(gè)Looper對(duì)象,如果存在則會(huì)拋出異常。
4、可見,prepare()方法,不能被調(diào)用兩次。這就保證了一個(gè)線程只有一個(gè)Looper對(duì)象。接下來我們看一下Looper的構(gòu)造函數(shù):privateLooper(booleanquitAllowed){mQueue=newMessageQueue(quitAllowed);mRun=true;mThread=Thread.currentThread();在Looper的構(gòu)造函數(shù)中,創(chuàng)建了MessageQueue對(duì)象,這也保證了一個(gè)線程只有一個(gè)MessageQueue對(duì)象。然后我們看看loop()方法:publicstaticvoidloop(){final
5、Looperme=myLooper();if(me==null){thrownewRuntimeException(”NoLooper;Looper.prepare()wasn'tcalledonthisthread.");}finalMessageQueuequeue=me.mQueue;//Makesuretheidentityofthisthreadisthatofthelocalprocess,//andkeeptrackofwhatthatidentitytokenactuallyis.Binder.clearCallingldentityO
6、;finallongident=Binder.clearCallingldentityO;for(;;){Messagemsg=queue.next();//mightblockif(msg==null){//Nomessageindicatesthatthemessagequeueisquitting.return;}//Thismustbeinalocalvariable,incaseaUIeventsetstheIoggerPrinterlogging=me.mLogging;if(logging!=null){logging.println("
7、>>>>>Dispatchingto"+msg.target+""+msg.callback+":"+msg.what);msg.target.dispatchMessage(msg);if(logging!=null){logging.println("<<<<8、.clearCallingldentityO;if(ident!=newldent){Log.