MessageQueue中的IdleHandler

在Android中株憾,Handler是我們最常用的消息處理類凑保,也是系統(tǒng)中非常重要的類挟裂,所以它的原理我們也應(yīng)該十分的清楚了解享钞,所以Handler,Looper诀蓉,MessageQueue成了我們必須學(xué)習(xí)和理解的東西栗竖,但是其中有一個(gè)接口很少被提及和使用,那就是IdleHandler渠啤。

IdleHandler

一狐肢、源碼解析

根據(jù)注釋我們很清楚的知道,這個(gè)接口方法是在消息隊(duì)列消息隊(duì)列全部處理完成后或者是在阻塞的過程中等待更多的消息的時(shí)候調(diào)用的沥曹,返回值絕對了處理一次后是否保存這個(gè)接口份名。雖然注釋很清楚,但是我們更多的應(yīng)該是要知道他是怎么處理的妓美,所以看源碼:

先看下接口的添加和刪除:

添加接口
刪除接口

從上面所貼出的源碼中我們可以得到兩點(diǎn):

1僵腺、添加和刪除是線程安全的

2、通過查找可以得知mIdleHandlers是一個(gè)ArrayList壶栋,因此這個(gè)接口是可以重復(fù)添加的辰如,不必?fù)?dān)心被替換問題

接下來我們看看接口是如何被調(diào)用的,通過源碼查找贵试,我們知道了它是在next()方法中調(diào)用的琉兜,同時(shí)我們也知道,這個(gè)方法也是消息隊(duì)列用來循環(huán)消息的地方毙玻,由于方法比較長豌蟋,我就只貼部分關(guān)鍵源碼:

其實(shí)這部分源碼注釋都已經(jīng)很清楚了

第一部分應(yīng)該算是條件判斷,首先判斷的是是不是第一次桑滩,pendingIdleHandlerCount的初始化為-1梧疲,其次判斷的是有沒有IdleHandler接口,如果沒有的話就是阻塞

第二部分是接口處理运准,主要是接口的調(diào)用以及判斷是不是接口只運(yùn)行一次就不需要了幌氮,最后是設(shè)置判斷的條件

二、系統(tǒng)源碼中的IdleHandler使用

通過上面的源碼分析可以找到戳吝,他是空閑時(shí)調(diào)用浩销,這一定是一個(gè)非常有用的接口。于是在系統(tǒng)源碼中查找它的使用听哭,發(fā)現(xiàn)了一點(diǎn)小小的驚喜慢洋,在這里分享給大家

在對源碼的學(xué)習(xí)中塘雳,我發(fā)現(xiàn)了IdleHandler的蹤跡,他出現(xiàn)的位置也是很關(guān)鍵的位置普筹,在ActivityThread中败明,學(xué)習(xí)過源碼的同學(xué)都知道,這是一個(gè)非常重要的類太防,因?yàn)槠鋵?shí)這才算是一個(gè)程序的入口妻顶,額,有點(diǎn)遠(yuǎn)了蜒车,有興趣的同學(xué)可以自己去看下這個(gè)類讳嘱,不多說,上源碼

上面的代碼很簡單酿愧,主要是添加和移除接口沥潭,以及接口實(shí)現(xiàn),但是接口實(shí)現(xiàn)的時(shí)候有個(gè)小驚喜啊嬉挡,看方法名稱就很意外doGcIfNeeded()钝鸽,這個(gè)地方涉及到回收。大家都知道系統(tǒng)會自動回收庞钢,但是什么時(shí)候回收拔恰,哪個(gè)地方回收的,一直都很模糊基括,現(xiàn)在總算知道一點(diǎn)了颜懊,但是這僅僅是一個(gè)方面的回收,不要當(dāng)成全部

回收

這個(gè)也很簡單了阱穗,主要是2次回收有最小時(shí)間間隔饭冬,就不多說了

Tips:

如果沒看過ActivityThread可能不知道上面的Looper.myQueue()指的是哪個(gè)Looper這里給大家說明下使鹅,還是先上源碼:

ActivityThread.java

使用過Looper的人應(yīng)該都很明白這個(gè)揪阶,從代碼中可以看出,這個(gè)地方準(zhǔn)備的是主線程患朱,所以回收添加的Looper是MainLooper鲁僚,另外大家不會忘了main方法吧:-D


三、其他源碼中的使用

請大家原諒我年輕裁厅,閱讀的開源代碼比較少冰沙,也可能是其他的開源項(xiàng)目中沒有這樣的需求,所以只在Glide中看到過這個(gè)接口的使用执虹,Google不愧為最了解源碼的啊拓挥,源碼貼給大家

Engine.java

Glide是一個(gè)面向接口的開源項(xiàng)目,而且寫的很高明袋励,本人的JAVA功底比較薄弱侥啤,所以看起來有點(diǎn)吃力当叭,就不給大家具體解釋了,大家有興趣可以自己去查看盖灸,同時(shí)也希望有大神分析下Glide的源碼蚁鳖,膜拜。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末赁炎,一起剝皮案震驚了整個(gè)濱河市醉箕,隨后出現(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)我...
    茶點(diǎn)故事閱讀 67,676評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著项棠,像睡著了一般悲雳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上香追,一...
    開封第一講書人閱讀 51,541評論 1 305
  • 那天合瓢,我揣著相機(jī)與錄音,去河邊找鬼透典。 笑死晴楔,一個(gè)胖子當(dāng)著我的面吹牛迁央,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播滥崩,決...
    沈念sama閱讀 40,292評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼岖圈,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了钙皮?” 一聲冷哼從身側(cè)響起蜂科,我...
    開封第一講書人閱讀 39,211評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎短条,沒想到半個(gè)月后导匣,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,655評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡茸时,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,846評論 3 336
  • 正文 我和宋清朗相戀三年贡定,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片可都。...
    茶點(diǎn)故事閱讀 39,965評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡缓待,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出渠牲,到底是詐尸還是另有隱情旋炒,我是刑警寧澤,帶...
    沈念sama閱讀 35,684評論 5 347
  • 正文 年R本政府宣布签杈,位于F島的核電站瘫镇,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏答姥。R本人自食惡果不足惜铣除,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,295評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望鹦付。 院中可真熱鬧尚粘,春花似錦、人聲如沸睁壁。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,894評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽潘明。三九已至,卻和暖如春秕噪,著一層夾襖步出監(jiān)牢的瞬間钳降,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,012評論 1 269
  • 我被黑心中介騙來泰國打工腌巾, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留遂填,地道東北人铲觉。 一個(gè)月前我還...
    沈念sama閱讀 48,126評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像吓坚,于是被迫代替她去往敵國和親撵幽。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,914評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,133評論 25 707
  • 一.Looper链烈、Handler、MessageQueue與Message的關(guān)系與相關(guān)概念 1.什么是Androi...
    Geeks_Liu閱讀 4,822評論 3 20
  • 1.要做一個(gè)盡可能流暢的ListView挚躯,你平時(shí)在工作中如何進(jìn)行優(yōu)化的强衡? ①Item布局,層級越少越好码荔,使用hie...
    fozero閱讀 728評論 0 0
  • 今天漩勤,我們一家去撫仙湖玩,那里可以玩沙缩搅、玩水锯七,都很有趣,但是我覺得最有趣的還是晚上到草叢中捉蟋蟀誉己。 ...
    施彥宏1閱讀 737評論 0 1
  • 第七章 我的高中同學(xué)也考取了研究生眉尸,這次,我們又到了同一個(gè)城市巨双,現(xiàn)在被稱之為帝都的北京噪猾。研究生三年,我過著所有女研...
    展融融閱讀 1,457評論 1 8