Handler簡單了解~

Handler是什么垒探?

Handler在我們android開發(fā)中是一項非常重要的機(jī)制身害,那Handler是什么呢懂讯?Handler是android提供用于更新UI的一套機(jī)制装哆,也是消息處理機(jī)制。

Handler重要的四個類:

? ? ? ? handler (處理器類):用來發(fā)送消息和處理消息旗国。

? ? ? ? looper(循環(huán)類):通過loop(for死循環(huán))查看當(dāng)前的消息鏈表中是否有需要處理的message枯怖。

? ? ? ? messagequeue(消息隊列類):用來存儲message的鏈表(鏈表中的消息message是按when(當(dāng)前系統(tǒng)的時間戳)從小到大的排列)。

? ? ? ? ? message(消息類):用來存儲消息內(nèi)容能曾。

那么如何將這幾個類串聯(lián)起來呢度硝?

通過handler.sendMessage這個方法设捐,把當(dāng)前的消息對象message傳入到handler中,通過handler中的messagequeue對象的引用(通過在handler的構(gòu)造函數(shù)中塘淑,用looper獲取到的)萝招,把Message放入到MessageQueue中。在message存放的時候存捺,message對象的target屬性記錄了當(dāng)前的handler槐沼。message通過消息的執(zhí)行時間when,從小到大排列插入到消息鏈表中捌治。我們looper的loop方法中的for(死循環(huán))去查看當(dāng)前的MessageQueue鏈表中是否有需要執(zhí)行的Message岗钩。通過Message的when(消息的執(zhí)行時間判斷)和當(dāng)前的系統(tǒng)時間戳做對比,如果當(dāng)前的系統(tǒng)時間戳小于當(dāng)前messagequeue鏈表中的消息執(zhí)行時間肖油,當(dāng)前的執(zhí)行進(jìn)入等待狀態(tài)兼吓。(管道機(jī)制,nativepollonce)如果當(dāng)前的系統(tǒng)時間戳大于或等于當(dāng)前的MessageQueue鏈表中的消息執(zhí)行時間森枪,我們就把當(dāng)前的message從消息鏈表中刪除视搏,并且把該消息返回給Looper的loop方法中。在loop方法中獲取到message以后判斷message所對應(yīng)的target(也就是發(fā)送message的handler)是否存在县袱,如果存在就調(diào)用target.dispathMessage方法把當(dāng)前的message傳入浑娜,在dispathMessage方法中,我們將調(diào)用handleMessage這個方法式散。把當(dāng)前取出的message傳出去筋遭。這樣在我們handler中重寫的handleMessage就拿到了當(dāng)前處理的消息。

消息隊列中的消息如何排隊暴拄?

boolean enqueueMessage(Message msg, long when) {

? ? ? ? synchronized (this) {

? ? ? ? ? //將消息執(zhí)行的絕對時間存儲起來

? ? ? ? ? ? msg.when = when;

? ? ? ? ? ? //msg2 : p = msg1

? ? ? ? ? ? //msg3: p? = msg1

? ? ? ? ? ? //msg4: p = msg1

? ? ? ? ? ? //msg5: p = msg4

? ? ? ? ? ? Message p = mMessages;

? ? ? ? ? ? //排序原理:每次新的消息進(jìn)來漓滔,都是和隊首消息比較,

? ? ? ? ? ? //1.如果比隊首執(zhí)行早乖篷,那么當(dāng)前消息到隊首

? ? ? ? ? ? //2.如果比隊首晚响驴,和隊首的下一個(B)比較,如果比B還晚那伐,再和B踏施。next (C) 比較石蔗。罕邀。。养距。

? ? ? ? ? ? if (p == null || when == 0 || when < p.when) {

? ? ? ? ? ? //1.發(fā)現(xiàn)哪個消息可以進(jìn)來诉探??比隊首還要早執(zhí)行的消息棍厌,當(dāng)前消息應(yīng)該是隊首消息肾胯,并且保存成功成員變量

? ? ? ? ? ? ? ? // New head, wake up the event queue if blocked.

? ? ? ? ? ? ? ? //msg1: msg1.next = p = null

? ? ? ? ? ? ? ? //msg4:msg4.next = msg1

? ? ? ? ? ? ? ? msg.next = p;

? ? ? ? ? ? ? ? //msg1:mMessages = msg1

? ? ? ? ? ? ? ? //msg4:mMessages = msg4;

? ? ? ? ? ? ? ? mMessages = msg;

? ? ? ? ? ? } else {

? ? ? ? ? ? //2.能走到這個分支竖席,說明當(dāng)前消息肯定比隊首消息執(zhí)行晚,會從隊首消息的下一個消息開始比較敬肚,直到找到合適的位置位置

? ? ? ? ? ? ? ? Message prev;

? ? ? ? ? ? ? ? for (;;) {

? ? ? ? ? ? ? ? //msg2:prev = p = msg1(1000)(隊首msg)

? ? ? ? ? ? ? ? //msg3:prev = p = msg1(隊首msg)

? ? ? ? ? ? ? ? //msg5:prev = p = msg4(隊首msg)

? ? ? ? ? ? ? ? ? ? prev = p;

? ? ? ? ? ? ? ? ? ? //msg2:p = p.next = msg1.next = null;

? ? ? ? ? ? ? ? ? ? //msg3:p = msg1.next = msg2;

? ? ? ? ? ? ? ? ? ? //msg5: p = p.next = msg1(和隊首消息的下一個消息進(jìn)行比較)

? ? ? ? ? ? ? ? ? ? p = p.next;

? ? ? ? ? ? ? ? ? ? if (p == null || when < p.when) {

? ? ? ? ? ? ? ? ? ? ? ? break;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? ? ? if (needWake && p.isAsynchronous()) {

? ? ? ? ? ? ? ? ? ? ? ? needWake = false;

? ? ? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? }

? ? ? ? ? ? ? ? //msg2:msg2.next = p = null

? ? ? ? ? ? ? ? //msg3: msg3.next = msg2

? ? ? ? ? ? ? ? msg.next = p; // invariant: p == prev.next

? ? ? ? ? ? ? ? //msg2:prev.next = msg1.next = msg = msg2

? ? ? ? ? ? ? ? //msg3:msg1.next = msg3

? ? ? ? ? ? ? ? prev.next = msg;

? ? ? ? ? ? }

? ? ? ? ? ? // We can assume mPtr != 0 because mQuitting is false.

? ? ? ? ? ? if (needWake) {

? ? ? ? ? ? ? ? nativeWake(mPtr);

? ? ? ? ? ? }

? ? ? ? }

? ? ? ? return true;

? ? }

下面為大家放上一張原理圖毕荐,可以參考上述進(jìn)行查看


最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市艳馒,隨后出現(xiàn)的幾起案子憎亚,更是在濱河造成了極大的恐慌,老刑警劉巖弄慰,帶你破解...
    沈念sama閱讀 218,122評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件第美,死亡現(xiàn)場離奇詭異,居然都是意外死亡陆爽,警方通過查閱死者的電腦和手機(jī)什往,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,070評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慌闭,“玉大人别威,你說我怎么就攤上這事÷刻蓿” “怎么了兔港?”我有些...
    開封第一講書人閱讀 164,491評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長仔拟。 經(jīng)常有香客問我衫樊,道長,這世上最難降的妖魔是什么利花? 我笑而不...
    開封第一講書人閱讀 58,636評論 1 293
  • 正文 為了忘掉前任科侈,我火速辦了婚禮,結(jié)果婚禮上炒事,老公的妹妹穿的比我還像新娘臀栈。我一直安慰自己,他們只是感情好挠乳,可當(dāng)我...
    茶點故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布权薯。 她就那樣靜靜地躺著,像睡著了一般睡扬。 火紅的嫁衣襯著肌膚如雪盟蚣。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天卖怜,我揣著相機(jī)與錄音屎开,去河邊找鬼。 笑死马靠,一個胖子當(dāng)著我的面吹牛奄抽,可吹牛的內(nèi)容都是我干的蔼两。 我是一名探鬼主播,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼逞度,長吁一口氣:“原來是場噩夢啊……” “哼额划!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起档泽,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤锁孟,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后茁瘦,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體品抽,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年甜熔,在試婚紗的時候發(fā)現(xiàn)自己被綠了圆恤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,965評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡腔稀,死狀恐怖盆昙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情焊虏,我是刑警寧澤淡喜,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站诵闭,受9級特大地震影響炼团,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜疏尿,卻給世界環(huán)境...
    茶點故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一瘟芝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧褥琐,春花似錦锌俱、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至磕洪,卻和暖如春吭练,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背褐鸥。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工线脚, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留赐稽,地道東北人叫榕。 一個月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓浑侥,卻偏偏與公主長得像,于是被迫代替她去往敵國和親晰绎。 傳聞我的和親對象是個殘疾皇子寓落,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,914評論 2 355