Android中Looper的quit方法和quitSafely方法

Looper是通過調(diào)用loop方法驅(qū)動著消息循環(huán)的進(jìn)行: 從MessageQueue中阻塞式地取出一個消息艇抠,然后讓Handler處理該消息胆描,周而復(fù)始瞬雹,loop方法是個死循環(huán)方法悄晃。
那如何終止消息循環(huán)呢训唱?我們可以調(diào)用Looper的quit方法或quitSafely方法,二者稍有不同挚冤。Looper的quit方法源碼如下:
public void quit() { mQueue.quit(false);}
1
2
3

Looper的quitSafely方法源碼如下:
public void quitSafely() { mQueue.quit(true);}
1
2
3

以上兩個方法中mQueue是MessageQueue類型的對象况增,二者都調(diào)用了MessageQueue中的quit方法,MessageQueue的quit方法源碼如下:
void quit(boolean safe) { if (!mQuitAllowed) { throw new IllegalStateException("Main thread not allowed to quit."); } synchronized (this) { if (mQuitting) { return; } mQuitting = true; if (safe) { removeAllFutureMessagesLocked(); } else { removeAllMessagesLocked(); } // We can assume mPtr != 0 because mQuitting was previously false. nativeWake(mPtr); }}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

通過觀察以上源碼我們可以發(fā)現(xiàn):
當(dāng)我們調(diào)用Looper的quit方法時训挡,實際上執(zhí)行了MessageQueue中的removeAllMessagesLocked方法澳骤,該方法的作用是把MessageQueue消息池中所有的消息全部清空,無論是延遲消息(延遲消息是指通過sendMessageDelayed或通過postDelayed等方法發(fā)送的需要延遲執(zhí)行的消息)還是非延遲消息澜薄。
當(dāng)我們調(diào)用Looper的quitSafely方法時为肮,實際上執(zhí)行了MessageQueue中的removeAllFutureMessagesLocked方法,通過名字就可以看出肤京,該方法只會清空MessageQueue消息池中所有的延遲消息颊艳,并將消息池中所有的非延遲消息派發(fā)出去讓Handler去處理,quitSafely相比于quit方法安全之處在于清空消息之前會派發(fā)所有的非延遲消息忘分。
無論是調(diào)用了quit方法還是quitSafely方法只會棋枕,Looper就不再接收新的消息。即在調(diào)用了Looper的quit或quitSafely方法之后妒峦,消息循環(huán)就終結(jié)了重斑,這時候再通過Handler調(diào)用sendMessage或post等方法發(fā)送消息時均返回false,表示消息沒有成功放入消息隊列MessageQueue中肯骇,因為消息隊列已經(jīng)退出了窥浪。
需要注意的是Looper的quit方法從API Level 1就存在了,但是Looper的quitSafely方法從API Level 18才添加進(jìn)來笛丙。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末漾脂,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子若债,更是在濱河造成了極大的恐慌符相,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,183評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異啊终,居然都是意外死亡镜豹,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,850評論 3 399
  • 文/潘曉璐 我一進(jìn)店門蓝牲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來趟脂,“玉大人,你說我怎么就攤上這事例衍∥羝冢” “怎么了?”我有些...
    開封第一講書人閱讀 168,766評論 0 361
  • 文/不壞的土叔 我叫張陵佛玄,是天一觀的道長硼一。 經(jīng)常有香客問我,道長梦抢,這世上最難降的妖魔是什么般贼? 我笑而不...
    開封第一講書人閱讀 59,854評論 1 299
  • 正文 為了忘掉前任,我火速辦了婚禮奥吩,結(jié)果婚禮上哼蛆,老公的妹妹穿的比我還像新娘。我一直安慰自己霞赫,他們只是感情好腮介,可當(dāng)我...
    茶點故事閱讀 68,871評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著端衰,像睡著了一般叠洗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上靴迫,一...
    開封第一講書人閱讀 52,457評論 1 311
  • 那天惕味,我揣著相機(jī)與錄音,去河邊找鬼玉锌。 笑死名挥,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的主守。 我是一名探鬼主播禀倔,決...
    沈念sama閱讀 40,999評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼参淫!你這毒婦竟也來了救湖?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,914評論 0 277
  • 序言:老撾萬榮一對情侶失蹤涎才,失蹤者是張志新(化名)和其女友劉穎鞋既,沒想到半個月后力九,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,465評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡邑闺,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,543評論 3 342
  • 正文 我和宋清朗相戀三年跌前,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片陡舅。...
    茶點故事閱讀 40,675評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡抵乓,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出靶衍,到底是詐尸還是另有隱情灾炭,我是刑警寧澤,帶...
    沈念sama閱讀 36,354評論 5 351
  • 正文 年R本政府宣布颅眶,位于F島的核電站蜈出,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏涛酗。R本人自食惡果不足惜掏缎,卻給世界環(huán)境...
    茶點故事閱讀 42,029評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望煤杀。 院中可真熱鬧,春花似錦沪哺、人聲如沸沈自。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,514評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽枯途。三九已至,卻和暖如春籍滴,著一層夾襖步出監(jiān)牢的瞬間酪夷,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,616評論 1 274
  • 我被黑心中介騙來泰國打工孽惰, 沒想到剛下飛機(jī)就差點兒被人妖公主榨干…… 1. 我叫王不留晚岭,地道東北人。 一個月前我還...
    沈念sama閱讀 49,091評論 3 378
  • 正文 我出身青樓勋功,卻偏偏與公主長得像坦报,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狂鞋,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,685評論 2 360

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