android開發(fā)教程深入剖析android消息機(jī)制

android開發(fā)教程深入剖析android消息機(jī)制

ID:16356219

大小:62.50 KB

頁(yè)數(shù):7頁(yè)

時(shí)間:2018-08-09

android開發(fā)教程深入剖析android消息機(jī)制_第1頁(yè)
android開發(fā)教程深入剖析android消息機(jī)制_第2頁(yè)
android開發(fā)教程深入剖析android消息機(jī)制_第3頁(yè)
android開發(fā)教程深入剖析android消息機(jī)制_第4頁(yè)
android開發(fā)教程深入剖析android消息機(jī)制_第5頁(yè)
資源描述:

《android開發(fā)教程深入剖析android消息機(jī)制》由會(huì)員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在行業(yè)資料-天天文庫(kù)。

1、android開發(fā)教程深入剖析Android消息機(jī)制在Android中,線程內(nèi)部或者線程之間進(jìn)行信息交互時(shí)經(jīng)常會(huì)使用消息,這些基礎(chǔ)的東西如果我們熟悉其內(nèi)部的原理,將會(huì)使我們?nèi)菀?、更好地架?gòu)系統(tǒng),避免一些低級(jí)的錯(cuò)誤。在學(xué)習(xí)Android中消息機(jī)制之前,我們先了解與消息有關(guān)的幾個(gè)類:1.Message消息對(duì)象,顧名思義就是記錄消息信息的類。這個(gè)類有幾個(gè)比較重要的字段:a.arg1和arg2:我們可以使用兩個(gè)字段用來(lái)存放我們需要傳遞的整型值,在Service中,我們可以用來(lái)存放Service的ID。b.obj:該字段是Object類型,我們可以讓該字段傳遞某個(gè)多項(xiàng)到消息的接受者中

2、。c.what:這個(gè)字段可以說是消息的標(biāo)志,在消息處理中,我們可以根據(jù)這個(gè)字段的不同的值進(jìn)行不同的處理,類似于我們?cè)谔幚鞡utton事件時(shí),通過switch(v.getId())判斷是點(diǎn)擊了哪個(gè)按鈕。在使用Message時(shí),我們可以通過newMessage()創(chuàng)建一個(gè)Message實(shí)例,但是Android更推薦我們通過Message.obtain()或者Handler.obtainMessage()獲取Message對(duì)象。這并不一定是直接創(chuàng)建一個(gè)新的實(shí)例,而是先從消息池中看有沒有可用的Message實(shí)例,存在則直接取出并返回這個(gè)實(shí)例。反之如果消息池中沒有可用的Message

3、實(shí)例,則根據(jù)給定的參數(shù)new一個(gè)新Message對(duì)象。通過分析源碼可得知,Android系統(tǒng)默認(rèn)情況下在消息池中實(shí)例化10個(gè)Message對(duì)象。2.MessageQueue消息隊(duì)列,用來(lái)存放Message對(duì)象的數(shù)據(jù)結(jié)構(gòu),按照“先進(jìn)先出”的原則存放消息。存放并非實(shí)際意義的保存,而是將Message對(duì)象以鏈表的方式串聯(lián)起來(lái)的。MessageQueue對(duì)象不需要我們自己創(chuàng)建,而是有Looper對(duì)象對(duì)其進(jìn)行管理,一個(gè)線程最多只可以擁有一個(gè)MessageQueue。我們可以通過Looper.myQueue()獲取當(dāng)前線程中的MessageQueue。3.LooperMessageQu

4、eue的管理者,在一個(gè)線程中,如果存在Looper對(duì)象,則必定存在MessageQueue對(duì)象,并且只存在一個(gè)Looper對(duì)象和一個(gè)MessageQueue對(duì)象。在Android系統(tǒng)中,除了主線程有默認(rèn)的Looper對(duì)象,其它線程默認(rèn)是沒有Looper對(duì)象。如果想讓我們新創(chuàng)建的線程擁有Looper對(duì)象時(shí),我們首先應(yīng)調(diào)用Looper.prepare()方法,然后再調(diào)用Looper.loop()方法。典型的用法如下:viewplaincopytoclipboardprint?1classLooperThreadextendsThread2{3publicHandlermHand

5、ler;4publicvoidrun()5{6Looper.prepare();1//其它需要處理的操作2Looper.loop();3}4}倘若我們的線程中存在Looper對(duì)象,則我們可以通過Looper.myLooper()獲取,此外我們還可以通過Looper.getMainLooper()獲取當(dāng)前應(yīng)用系統(tǒng)中主線程的Looper對(duì)象。在這個(gè)地方有一點(diǎn)需要注意,假如Looper對(duì)象位于應(yīng)用程序主線程中,則Looper.myLooper()和Looper.getMainLooper()獲取的是同一個(gè)對(duì)象。4.Handler消息的處理者。通過Handler對(duì)象我們可以封裝Me

6、ssage對(duì)象,然后通過sendMessage(msg)把Message對(duì)象添加到MessageQueue中;當(dāng)MessageQueue循環(huán)到該Message時(shí),就會(huì)調(diào)用該Message對(duì)象對(duì)應(yīng)的handler對(duì)象的handleMessage()方法對(duì)其進(jìn)行處理。由于是在handleMessage()方法中處理消息,因此我們應(yīng)該編寫一個(gè)類繼承自Handler,然后在handleMessage()處理我們需要的操作。viewplaincopytoclipboardprint?5publicclassMessageServiceextendsService67{8private

7、staticfinalStringTAG="MessageService";9privatestaticfinalintKUKA=0;10privateLooperlooper;11privateServiceHandlerhandler;12/**13*由于處理消息是在Handler的handleMessage()方法中,因此我們需要自己編寫類14*繼承自Handler類,然后在handleMessage()中編寫我們所需要的功能代碼15*@authorcoolszy16*17*/18privatefinalcl

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文

此文檔下載收益歸作者所有

當(dāng)前文檔最多預(yù)覽五頁(yè),下載文檔查看全文
溫馨提示:
1. 部分包含數(shù)學(xué)公式或PPT動(dòng)畫的文件,查看預(yù)覽時(shí)可能會(huì)顯示錯(cuò)亂或異常,文件下載后無(wú)此問題,請(qǐng)放心下載。
2. 本文檔由用戶上傳,版權(quán)歸屬用戶,天天文庫(kù)負(fù)責(zé)整理代發(fā)布。如果您對(duì)本文檔版權(quán)有爭(zhēng)議請(qǐng)及時(shí)聯(lián)系客服。
3. 下載前請(qǐng)仔細(xì)閱讀文檔內(nèi)容,確認(rèn)文檔內(nèi)容符合您的需求后進(jìn)行下載,若出現(xiàn)內(nèi)容與標(biāo)題不符可向本站投訴處理。
4. 下載文檔時(shí)可能由于網(wǎng)絡(luò)波動(dòng)等原因無(wú)法下載或下載錯(cuò)誤,付費(fèi)完成后未能成功下載的用戶請(qǐng)聯(lián)系客服處理。