handler是如何保證延遲消息的實(shí)現(xiàn)?
如果發(fā)送過(guò)來(lái)的message有延遲參數(shù)when>0,那么會(huì)和現(xiàn)在的時(shí)間進(jìn)行相減,得出一個(gè)值,這只休眠喚醒機(jī)制,在n秒之后喚醒,繼續(xù)執(zhí)行。
handler post和send兩種發(fā)送消息的方式有何不同?如何取舍。
post發(fā)送一個(gè)runnable對(duì)象,這個(gè)對(duì)象會(huì)被Message對(duì)象的callback字段所引用,最后這個(gè)message對(duì)象會(huì)被添加進(jìn)消息隊(duì)列,這樣就和正常的消息一樣最后被looper取出,交給handler處理。
主線程的LOOP可以通過(guò)quit()退出嗎?為什么?
主線程在創(chuàng)建LOOP的時(shí)候在構(gòu)造方法中傳遞了一個(gè)參數(shù)mQuitAllowed,mQuitAllowed這個(gè)參數(shù)為false決定了這個(gè)LOOP是不可以退出的,我們?cè)谄渌€程創(chuàng)建的時(shí)候也可以選擇這個(gè)參數(shù),默認(rèn)是true ,可以退出的。
Loop的quitSafely()方法和quit()方法的區(qū)別:
quit()方法是會(huì)清空現(xiàn)在消息池中的所有消息,而quitSafely()方法則會(huì)將延遲的消息全部清楚,非延遲的消息會(huì)配發(fā)到handler執(zhí)行。這兩個(gè)方法執(zhí)行之后,Loop消息循環(huán)就終止了,繼續(xù)發(fā)送消息會(huì)失敗。
Message的復(fù)用機(jī)制
Message被handler處理之后會(huì)被加入到回收池中,這個(gè)池子是一個(gè)最大大小為50的鏈表。