真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

分析android源碼,Android開發(fā)詳解

Android Handler源碼分析

Handler相信安卓開發(fā)者都很熟悉了,平常在開發(fā)的時(shí)候應(yīng)用場景很多,但是Handler到底是如何發(fā)送消息和接收消息的呢,它內(nèi)部到底做了些什么工作呢,本篇文章就Handler來分析它的源碼流程

成都創(chuàng)新互聯(lián)2013年開創(chuàng)至今,先為醴陵等服務(wù)建站,醴陵等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為醴陵企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

在Handler中有多個(gè)發(fā)送消息的方法,以下為幾個(gè)例子:

第一個(gè)不用多說直接發(fā)送消息的,延遲時(shí)間是0

第二個(gè)發(fā)送帶有延遲的消息,如果delayMillis 是負(fù)數(shù)則設(shè)置為0

第三個(gè)發(fā)送消息排在消息隊(duì)列的頭部,等待處理

從源碼可以看出來第一個(gè)和第二個(gè)方法都是調(diào)用sendMessageAtTime方法,而sendMessageAtTime方法調(diào)用的是enqueueMessage方法,所以它們調(diào)用的都是enqueueMessage方法

走到這里我們看到這個(gè)msg.target 就是當(dāng)前Handler,這里之所以這樣寫是為了后面用于消息分發(fā)的,這里的queue不會(huì)為空,我們來看queue到底在哪里實(shí)例的

在這里看到不僅MessageQueue在這里實(shí)例化并且Looper也是在這里實(shí)例化的,在這里有個(gè)疑問就是mQueue這樣寫會(huì)不會(huì)為空呢,帶著這個(gè)疑問我們后面解答,我們先看Looper中的myLooper方法

發(fā)現(xiàn)是從ThreadLocal靜態(tài)對象里面獲取的Looper對象,再看下在哪里設(shè)置的呢

在這里我們看下ThreadLocal是怎么設(shè)置和獲取的,找到set方法和get方法

在這里說明一下一個(gè)線程對應(yīng)一個(gè)ThreadLocalMap 一個(gè)ThreadLocalMap 對應(yīng)一個(gè)key和value值,key對應(yīng)的是sThreadLocal,value對應(yīng)的存儲(chǔ)的Looper對象。接著在這里發(fā)現(xiàn)MessageQueue是在這里實(shí)例化的,這里有個(gè)prepare方法里面設(shè)置的,那到底在哪里調(diào)用的呢。熟悉Activity啟動(dòng)流程源碼的童鞋都知道,最終Activity啟動(dòng)流程操作主要是在ActivityThread里面的,并且Android程序剛開始的入口是ActivityThread的main方法,所以我們查看main方法

我們看到在入口調(diào)用了Looper.prepareMainLooper方法,我們直接進(jìn)入方法

在這里驚奇的發(fā)現(xiàn)調(diào)用了prepare方法,在下面判斷中保證一個(gè)線程中只能有一個(gè)Looper對象,否則拋出異常。

走到這里做個(gè)總結(jié):

從上面可以看出幾乎所有的發(fā)送消息方法都會(huì)調(diào)用enqueueMessage方法,我們查看MessageQueue中的enqueueMessage方法

這個(gè)方法主要是用來存儲(chǔ)消息隊(duì)列的,并且通過時(shí)間進(jìn)行有序排序,有了消息之后就通過nativeWake方法這個(gè)方法是底層實(shí)現(xiàn)的,這個(gè)方法是用通過JNI實(shí)現(xiàn)的,即在底層通過C實(shí)現(xiàn)的,底層在這里就不多說了,不是本篇主要內(nèi)容。在上面我們在ActivityThread中main方法中調(diào)用了Looper.loop()方法,這樣這個(gè)方法就被喚醒,接著我們查看此方法到底干了啥

這個(gè)方法是個(gè)無限循環(huán)方法等待獲取可以處理分發(fā)msg消息的,我們重點(diǎn)來看MessageQueue.next()方法

這個(gè)方法很重要在這里主要是取出Message返回給Looper.loop()用做消息分發(fā),現(xiàn)在來看Looper.loop()方法中調(diào)用的Handler dispatchMessage方法

在這里如果Message 設(shè)置了callback 的話,則直接調(diào)用 message.callback.run()方法,如果有設(shè)置Handler的callback,則也進(jìn)行分發(fā),如果都沒有的話,那就直接調(diào)用handleMessage(Message msg)方法。

做個(gè)總結(jié):

最后:

在這里多說幾句為什么用鏈表結(jié)構(gòu)的方式進(jìn)行存儲(chǔ)消息,而不用數(shù)組的方式呢,熟悉ArrayList源碼的開發(fā)者都知道它里面其實(shí)就是以數(shù)組的方式進(jìn)行存儲(chǔ)數(shù)據(jù)的,而LinkedList是以節(jié)點(diǎn)的方式存儲(chǔ)的,相當(dāng)于二叉樹結(jié)構(gòu)的和鏈表結(jié)構(gòu)類似,所以最終我們知道鏈接結(jié)構(gòu)主要是增加刪除效率高,而數(shù)組的方式則是查詢的效率高

Android源碼解析RPC系列(一)---Binder原理

看了幾天的Binder,決定有必要寫一篇博客,記錄一下學(xué)習(xí)成果,Binder是Android中比較綜合的一塊知識(shí)了,目前的理解只限于JAVA層。首先Binder是干嘛用的?不用說,跨進(jìn)程通信全靠它,操作系統(tǒng)的不同進(jìn)程之間,數(shù)據(jù)不共享,對于每個(gè)進(jìn)程來說,它都天真地以為自己獨(dú)享了整個(gè)系統(tǒng),完全不知道其他進(jìn)程的存在,進(jìn)程之間需要通信需要某種系統(tǒng)機(jī)制才能完成,在Android整個(gè)系統(tǒng)架構(gòu)中,采用了大量的C/S架構(gòu)的思想,所以Binder的作用就顯得非常重要了,但是這種機(jī)制為什么是Binder呢?在Linux中的RPC方式有管道,消息隊(duì)列,共享內(nèi)存等,消息隊(duì)列和管道采用存儲(chǔ)-轉(zhuǎn)發(fā)方式,即數(shù)據(jù)先從發(fā)送方緩存區(qū)拷貝到內(nèi)核開辟的緩存區(qū)中,然后再從內(nèi)核緩存區(qū)拷貝到接收方緩存區(qū),這樣就有兩次拷貝過程。共享內(nèi)存不需要拷貝,但控制復(fù)雜,難以使用。Binder是個(gè)折中的方案,只需要拷貝一次就行了。其次Binder的安全性比較好,好在哪里,在下還不是很清楚,基于安全性和傳輸?shù)男士紤],選擇了Binder。Binder的英文意思是粘結(jié)劑,Binder對象是一個(gè)可以跨進(jìn)程引用的對象,它的實(shí)體位于一個(gè)進(jìn)程中,這個(gè)進(jìn)程一般是Server端,該對象提供了一套方法用以實(shí)現(xiàn)對服務(wù)的請求,而它的引用卻遍布于系統(tǒng)的各個(gè)進(jìn)程(Client端)之中,這樣Client通過Binder的引用訪問Server,所以說,Binder就像膠水一樣,把系統(tǒng)各個(gè)進(jìn)程粘結(jié)在一起了,廢話確實(shí)有點(diǎn)多。

為了從而保障了系統(tǒng)的安全和穩(wěn)定,整個(gè)系統(tǒng)被劃分成內(nèi)核空間和用戶空間

內(nèi)核空間:獨(dú)立于普通的應(yīng)用程序,可以訪問受保護(hù)的內(nèi)存空間,有訪問底層硬件設(shè)備的所有權(quán)限。

用戶空間:相對與內(nèi)核空間,上層運(yùn)用程序所運(yùn)行的空間就是用戶空間,用戶空間訪問內(nèi)核空間的唯一方式就是系統(tǒng)調(diào)用。一個(gè)4G的虛擬地址空間,其中3G是用戶空間,剩余的1G是內(nèi)核空間。如果一個(gè)用戶空間想與另外一個(gè)用戶空間進(jìn)行通信,就需要內(nèi)核模塊支持,這個(gè)運(yùn)行在內(nèi)核空間的,負(fù)責(zé)各個(gè)用戶進(jìn)程通過Binder通信的內(nèi)核模塊叫做Binder驅(qū)動(dòng),雖然叫做Binder驅(qū)動(dòng),但是和硬件并沒有什么關(guān)系,只是實(shí)現(xiàn)方式和設(shè)備驅(qū)動(dòng)程序是一樣的,提供了一些標(biāo)準(zhǔn)文件操作。

在寫AIDL的時(shí)候,一般情況下,我們有兩個(gè)進(jìn)程,一個(gè)作為Server端提供某種服務(wù),然后另外一個(gè)進(jìn)程作為Client端,連接Server端之后,就 可以使用Server里面定義的服務(wù)。這種思想是一種典型的C/S的思想。值得注意的是Android系統(tǒng)中的Binder自身也是C/S的架構(gòu),也有Server端與Client端。一個(gè)大的C/S架構(gòu)中,也有一個(gè)小的C/S架構(gòu)。

先籠統(tǒng)的說一下,在整個(gè)Binder框架中,由系列組件組成,分別是Client、Server、ServiceManager和Binder驅(qū)動(dòng)程序,其中Client、Server和ServiceManager運(yùn)行在用戶空間,Binder驅(qū)動(dòng)程序運(yùn)行內(nèi)核空間。運(yùn)行在用戶空間中的Client、Server和ServiceManager,是在三個(gè)不同進(jìn)程中的,Server進(jìn)程中中定義了服務(wù)提供給Client進(jìn)程使用,并且Server中有一個(gè)Binder實(shí)體,但是Server中定義的服務(wù)并不能直接被Client使用,它需要向ServiceManager注冊,然后Client要用服務(wù)的時(shí)候,直接向ServiceManager要,ServiceManager返回一個(gè)Binder的替身(引用)給Client,這樣Client就可以調(diào)用Server中的服務(wù)了。

場景 :進(jìn)程A要調(diào)用進(jìn)程B里面的一個(gè)draw方法處理圖片。

分析 :在這種場景下,進(jìn)程A作為Client端,進(jìn)程B做為Server端,但是A/B不在同一個(gè)進(jìn)程中,怎么來調(diào)用B進(jìn)程的draw方法呢,首先進(jìn)程B作為Server端創(chuàng)建了Binder實(shí)體,為其取一個(gè)字符形式,可讀易記的名字,并將這個(gè)Binder連同名字以數(shù)據(jù)包的形式通過Binder驅(qū)動(dòng)發(fā)送給ServiceManager,也就是向ServiceManager注冊的過程,告訴ServiceManager,我是進(jìn)程B,擁有圖像處理的功能,ServiceManager從數(shù)據(jù)包中取出名字和引用以一個(gè)注冊表的形式保留了Server進(jìn)程的注冊信息。為什么是以數(shù)據(jù)包的形式呢,因?yàn)檫@是兩個(gè)進(jìn)程,直接傳遞對象是不行滴,只能是一些描述信息?,F(xiàn)在Client端進(jìn)程A聯(lián)系ServiceManager,說現(xiàn)在我需要進(jìn)程B中圖像處理的功能,ServiceManager從注冊表中查到了這個(gè)Binder實(shí)體,但是呢,它并不是直接把這個(gè)Binder實(shí)體直接給Client,而是給了一個(gè)Binder實(shí)體的代理,或者說是引用,Client通過Binder的引用訪問Server。分析到現(xiàn)在,有個(gè)關(guān)鍵的問題需要說一下,ServiceManager是一個(gè)進(jìn)程,Server是另一個(gè)進(jìn)程,Server向ServiceManager注冊Binder必然會(huì)涉及進(jìn)程間通信。當(dāng)前實(shí)現(xiàn)的是進(jìn)程間通信卻又要用到進(jìn)程間通信,這就好象蛋可以孵出雞前提卻是要找只雞來孵蛋,確實(shí)是這樣的,ServiceManager中預(yù)先有了一個(gè)自己的Binder對象(實(shí)體),就是那只雞,然后Server有個(gè)Binder對象的引用,就是那個(gè)蛋,Server需要通過這個(gè)Binder的引用來實(shí)現(xiàn)Binder的注冊。雞就一只,蛋有很多,ServiceManager進(jìn)程的Binder對象(實(shí)體)僅有一個(gè),其他進(jìn)程所擁有的全部都是它的代理。同樣一個(gè)Server端Binder實(shí)體也應(yīng)該只有一個(gè),對應(yīng)所有Client端全部都是它的代理。

我們再次理解一下Binder是什么?在Binder通信模型的四個(gè)角色里面;他們的代表都是“Binder”,一個(gè)Binder對象就代表了所有,包括了Server,Client,ServiceManager,這樣,對于Binder通信的使用者而言,不用關(guān)心實(shí)現(xiàn)的細(xì)節(jié)。對Server來說,Binder指的是Binder實(shí)體,或者說是本地對象,對于Client來說,Binder指的是Binder代理對象,也就是Binder的引用。對于Binder驅(qū)動(dòng)而言,在Binder對象進(jìn)行跨進(jìn)程傳遞的時(shí)候,Binder驅(qū)動(dòng)會(huì)自動(dòng)完成這兩種類型的轉(zhuǎn)換。

簡單的總結(jié)一下,通過上面一大段的分析,一個(gè)Server在使用的時(shí)候需要經(jīng)歷三個(gè)階段

1、定義一個(gè)AIDL文件

Game.aidl

GameManager .aidl

2、定義遠(yuǎn)端服務(wù)Service

在遠(yuǎn)程服務(wù)中的onBind方法,實(shí)現(xiàn)AIDL接口的具體方法,并且返回Binder對象

3、本地創(chuàng)建連接對象

以上就是一個(gè)遠(yuǎn)端服務(wù)的一般套路,如果是在兩個(gè)進(jìn)程中,就可以進(jìn)程通信了,現(xiàn)在我們分析一下,這個(gè)通信的流程。重點(diǎn)是GameManager這個(gè)編譯生成的類。

從類的關(guān)系來看,首先接口GameManager 繼承 IInterface ,IInterface是一個(gè)接口,在GameManager內(nèi)部有一個(gè)內(nèi)部類Stub,Stub繼承了Binder,(Binder實(shí)現(xiàn)了IBinder),并且實(shí)現(xiàn)了GameManager接口,在Stub中還有一個(gè)內(nèi)部類Proxy,Proxy也實(shí)現(xiàn)了GameManager接口,一個(gè)整體的結(jié)構(gòu)是這樣的

現(xiàn)在的問題是,Stub是什么?Proxy又是什么?在上面說了在Binder通信模型的四個(gè)角色里面;他們的代表都是“Binder”,一個(gè)Binder對象就代表了所有,包括了Server,Clinet,ServiceManager,為了兩個(gè)進(jìn)程的通信,系統(tǒng)給予的內(nèi)核支持是Binder,在抽象一點(diǎn)的說,Binder是系統(tǒng)開辟的一塊內(nèi)存空間,兩個(gè)進(jìn)程往這塊空間里面讀寫數(shù)據(jù)就行了,Stub從Binder中讀數(shù)據(jù),Proxy向Binder中寫數(shù)據(jù),達(dá)到進(jìn)程間通信的目的。首先我們分析Stub。

Stub 類繼承了Binder ,說明了Stub有了跨進(jìn)程傳輸?shù)哪芰?,?shí)現(xiàn)了GameManager接口,說明它有了根據(jù)游戲ID查詢一個(gè)游戲的能力。我們在bind一個(gè)Service之后,在onServiceConnecttion的回調(diào)里面,就是通過asInterface方法拿到一個(gè)遠(yuǎn)程的service的。

asInterface調(diào)用queryLocalInterface。

mDescriptor,mOwner其實(shí)是Binder的成員變量,Stub繼承了Binder,在構(gòu)造函數(shù)的時(shí)候,對著兩個(gè)變量賦的值。

如果客戶端和服務(wù)端是在一個(gè)進(jìn)程中,那么其實(shí)queryLocalInterface獲取的就是Stub對象,如果不在一個(gè)進(jìn)程queryLocalInterface查詢的對象肯定為null,因?yàn)椴煌M(jìn)程有不同虛擬機(jī),肯定查不到mOwner對象的,所以這時(shí)候其實(shí)是返回的Proxy對象了。拿到Stub對象后,通常在onServiceConnected中,就把這個(gè)對象轉(zhuǎn)換成我們多定義AIDL接口。

比如我們這里會(huì)轉(zhuǎn)換成GameManager,有了GameManager對象,就可以調(diào)用后querryGameById方法了。如果是一個(gè)進(jìn)程,那直接調(diào)用的是自己的querryGameById方法,如果不是一個(gè)進(jìn)程,那調(diào)用了就是代理的querryGameById方法了。

看到其中關(guān)鍵的一行是

mRemote就是一個(gè)IBinder對象,相對于Stub,Proxy 是組合關(guān)系(HAS-A),內(nèi)部有一個(gè)IBinder對象mRemote,Stub是繼承關(guān)系(IS-A),直接實(shí)現(xiàn)了IBinder接口。

transact是個(gè)native方法,最終還會(huì)回掉JAVA層的onTransact方法。

onTransact根據(jù)調(diào)用號(hào)(每個(gè)AIDL函數(shù)都有一個(gè)編號(hào),在跨進(jìn)程的時(shí)候,不會(huì)傳遞函數(shù),而是傳遞編號(hào)指明調(diào)用哪個(gè)函數(shù))調(diào)用相關(guān)函數(shù);在這個(gè)例子里面,調(diào)用了Binder本地對象的querryGameById方法;這個(gè)方法將結(jié)果返回給驅(qū)動(dòng),驅(qū)動(dòng)喚醒掛起的Client進(jìn)程里面的線程并將結(jié)果返回。于是一次跨進(jìn)程調(diào)用就完成了。

***Please accept mybest wishes for your happiness and success ! ***

[Android源碼分析] - 異步通信Handler機(jī)制

一、問題:在Android啟動(dòng)后會(huì)在新進(jìn)程里創(chuàng)建一個(gè)主線程,也叫UI線程( 非線程安全 )這個(gè)線程主要負(fù)責(zé)監(jiān)聽屏幕點(diǎn)擊事件與界面繪制。當(dāng)Application需要進(jìn)行耗時(shí)操作如網(wǎng)絡(luò)請求等,如直接在主線程進(jìn)行容易發(fā)生ANR錯(cuò)誤。所以會(huì)創(chuàng)建子線程來執(zhí)行耗時(shí)任務(wù),當(dāng)子線程執(zhí)行完畢需要通知UI線程并修改界面時(shí),不可以直接在子線程修改UI,怎么辦?

解決方法:Message Queue機(jī)制可以實(shí)現(xiàn)子線程與UI線程的通信。

該機(jī)制包括Handler、Message Queue、Looper。Handler可以把消息/ Runnable對象 發(fā)給Looper,由它把消息放入所屬線程的消息隊(duì)列中,然后Looper又會(huì)自動(dòng)把消息隊(duì)列里的消息/Runnable對象 廣播 到所屬線程里的Handler,由Handler處理接收到的消息或Runnable對象。

1、Handler

每次創(chuàng)建Handler對象時(shí),它會(huì)自動(dòng)綁定到創(chuàng)建它的線程上。如果是主線程則默認(rèn)包含一個(gè)Message Queue,否則需要自己創(chuàng)建一個(gè)消息隊(duì)列來存儲(chǔ)。

Handler是多個(gè)線程通信的信使。比如在線程A中創(chuàng)建AHandler,給它綁定一個(gè)ALooper,同時(shí)創(chuàng)建屬于A的消息隊(duì)列AMessageQueue。然后在線程B中使用AHandler發(fā)送消息給ALooper,ALooper會(huì)把消息存入到AMessageQueue,然后再把AMessageQueue廣播給A線程里的AHandler,它接收到消息會(huì)進(jìn)行處理。從而實(shí)現(xiàn)通信。

2、Message Queue

在主線程里默認(rèn)包含了一個(gè)消息隊(duì)列不需要手動(dòng)創(chuàng)建。在子線程里,使用Looper.prepare()方法后,會(huì)先檢查子線程是否已有一個(gè)looper對象,如果有則無法創(chuàng)建,因?yàn)槊總€(gè)線程只能擁有一個(gè)消息隊(duì)列。沒有的話就為子線程創(chuàng)建一個(gè)消息隊(duì)列。

Handler類包含Looper指針和MessageQueue指針,而Looper里包含實(shí)際MessageQueue與當(dāng)前線程指針。

下面分別就UI線程和worker線程講解handler創(chuàng)建過程:

首先,創(chuàng)建handler時(shí),會(huì)自動(dòng)檢查當(dāng)前線程是否包含looper對象,如果包含,則將handler內(nèi)的消息隊(duì)列指向looper內(nèi)部的消息隊(duì)列,否則,拋出異常請求執(zhí)行l(wèi)ooper.prepare()方法。

- 在 UI線程 中,系統(tǒng)自動(dòng)創(chuàng)建了Looper 對象,所以,直接new一個(gè)handler即可使用該機(jī)制;

- 在 worker線程 中,如果直接創(chuàng)建handler會(huì)拋出運(yùn)行時(shí)異常-即通過查‘線程-value’映射表發(fā)現(xiàn)當(dāng)前線程無looper對象。所以需要先調(diào)用Looper.prepare()方法。在prepare方法里,利用ThreadLocalLooper對象為當(dāng)前線程創(chuàng)建一個(gè)Looper(利用了一個(gè)Values類,即一個(gè)Map映射表,專為thread存儲(chǔ)value,此處為當(dāng)前thread存儲(chǔ)一個(gè)looper對象)。然后繼續(xù)創(chuàng)建handler, 讓handler內(nèi)部的消息隊(duì)列指向該looper的消息隊(duì)列(這個(gè)很重要,讓handler指向looper里的消息隊(duì)列,即二者共享同一個(gè)消息隊(duì)列,然后handler向這個(gè)消息隊(duì)列發(fā)送消息,looper從這個(gè)消息隊(duì)列獲取消息) 。然后looper循環(huán)消息隊(duì)列即可。當(dāng)獲取到message消息,會(huì)找出message對象里的target,即原始發(fā)送handler,從而回調(diào)handler的handleMessage() 方法進(jìn)行處理。

- handler與looper共享消息隊(duì)列 ,所以handler發(fā)送消息只要入列,looper直接取消息即可。

- 線程與looper映射表 :一個(gè)線程最多可以映射一個(gè)looper對象。通過查表可知當(dāng)前線程是否包含looper,如果已經(jīng)包含則不再創(chuàng)建新looper。

5、基于這樣的機(jī)制是怎樣實(shí)現(xiàn)線程隔離的,即在線程中通信呢。?

核心在于 每一個(gè)線程擁有自己的handler、message queue、looper體系 。而 每個(gè)線程的Handler是公開 的。B線程可以調(diào)用A線程的handler發(fā)送消息到A的共享消息隊(duì)列去,然后A的looper會(huì)自動(dòng)從共享消息隊(duì)列取出消息進(jìn)行處理。反之一樣。

二、上面是基于子線程中利用主線程提供的Handler發(fā)送消息出去,然后主線程的Looper從消息隊(duì)列中獲取并處理。那么還有另外兩種情況:

1、主線程發(fā)送消息到子線程中;

采用的方法和前面類似。要在子線程中實(shí)例化AHandler并設(shè)定處理消息的方法,同時(shí)由于子線程沒有消息隊(duì)列和Looper的輪詢,所以要加上Looper.prepare(),Looper.loop()分別創(chuàng)建消息隊(duì)列和開啟輪詢。然后在主線程中使用該AHandler去發(fā)送消息即可。

2、子線程A與子線程B之間的通信。

1、 Handler為什么能夠?qū)崿F(xiàn)不同線程的通信?核心點(diǎn)在哪?

不同線程之間,每個(gè)線程擁有自己的Handler、消息隊(duì)列和Looper。Handler是公共的,線程可以通過使用目標(biāo)線程的Handler對象來發(fā)送消息,這個(gè)消息會(huì)自動(dòng)發(fā)送到所屬線程的消息隊(duì)列中去,線程自帶的Looper對象會(huì)不斷循環(huán)從里面取出消息并把消息發(fā)送給Handler,回調(diào)自身Handler的handlerMessage方法,從而實(shí)現(xiàn)了消息的線程間傳遞。

2、 Handler的核心是一種事件激活式(類似傳遞一個(gè)中斷)的還是主要是用于傳遞大量數(shù)據(jù)的?重點(diǎn)在Message的內(nèi)容,偏向于數(shù)據(jù)傳輸還是事件傳輸。

目前的理解,它所依賴的是消息隊(duì)列,發(fā)送的自然是消息,即類似事件中斷。

0、 Android消息處理機(jī)制(Handler、Looper、MessageQueue與Message)

1、 Handler、Looper源碼閱讀

2、 Android異步消息處理機(jī)制完全解析,帶你從源碼的角度徹底理解

謝謝!

wingjay

![](;s=460)


分享標(biāo)題:分析android源碼,Android開發(fā)詳解
轉(zhuǎn)載來源:http://weahome.cn/article/dsdocip.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部