桑小年
關(guān)注
2018-06-30 16:07 · 字?jǐn)?shù) 1665 · 閱讀 10 ·? Android源碼
工作的時(shí)候發(fā)現(xiàn)自己對(duì)于很多東西用起來(lái)得心應(yīng)手,原理機(jī)制也背誦的滾瓜爛熟,但是一問(wèn)到源碼腦子就....瓦特了频祝!所以最近準(zhǔn)備從頭開(kāi)始學(xué)習(xí)源碼,學(xué)習(xí)大神們優(yōu)秀的思想脆淹!
本文是對(duì)Handler機(jī)制的源碼分析常空,目的是為了能夠從源碼角度一點(diǎn)點(diǎn)的理解Handler機(jī)制,里面會(huì)出現(xiàn)大量的源碼盖溺,所以會(huì)比較枯燥漓糙,但是只要認(rèn)真看完,相信你一定會(huì)對(duì)Handler機(jī)制的實(shí)現(xiàn)方法有更加清晰的認(rèn)識(shí)
? ? Handler是用起來(lái)非常簡(jiǎn)單烘嘱!
private Handler handler = new Handler(){
? ? ? ? @Override
? ? ? ? public void handleMessage(Message msg) {
? ? ? ? ? ? super.handleMessage(msg);
? ? ? ? ? ? //處理接收到的消息
? ? ? ? }
? ? };
初始化之后昆禽,在子線(xiàn)程進(jìn)行完耗時(shí)操作之后蝗蛙,使用
handler.sendEmptyMessage(what)
好了,現(xiàn)在就從sendEmptyMessage 方法開(kāi)始醉鳖,一步步的解析handler整個(gè)工作流程 — — 注意捡硅,Handler開(kāi)始向消息隊(duì)列發(fā)送消息了;
點(diǎn)進(jìn)去之后盗棵,我們會(huì)發(fā)現(xiàn)壮韭,sendEmptyMessage 、sendMessage 最終都是在調(diào)用 sendMessageAtTime 方法纹因,將發(fā)送的消息放入messgeQueue喷屋;需要注意的一點(diǎn)是,sendMessageDelayed方法中瞭恰,已經(jīng)將 delayMillis 延遲時(shí)間轉(zhuǎn)換成了 SystemClock.uptimeMillis() + delayMillis屯曹,指的是該消息被取出來(lái)執(zhí)行的時(shí)間,這一點(diǎn)會(huì)在MessageQueue中顯的比較重要
? ? //直接調(diào)用 sendEmptyMessageDelayed 方法
? ? public final boolean sendEmptyMessage(int what){
? ? ? ? //直接調(diào)用 sendEmptyMessageDelayed 方法
? ? ? ? return s