從原始碼看Handler和Looper

2021-07-10 04:40:37 字數 1663 閱讀 6128

private looper(boolean quitallowed) 

public handler(looper looper, callback callback, boolean async)

public inte***ce callback

從looper的構造方法可以看出,looper建立messagequeue,並與當前執行緒繫結。

從handler的構造方法可以看出,例項化handler需要乙個looper例項。而handler一般是在主線程中例項化,looper為mainlooper。

public final boolean post(runnable r) 

private static message getpostmessage(runnable r)

public final boolean sendmessage(message msg)

post()系列方法和sendmessage()系列方法本質是一樣的,最終都會呼叫sendmessagedelayed()方法,post()系列方法會將runnable封裝到message的callback屬性中。

public final boolean sendmessagedelayed(message msg, long delaymillis) 

return sendmessageattime(msg, systemclock.uptimemillis() + delaymillis);

}public boolean sendmessageattime(message msg, long uptimemillis)

return enqueuemessage(queue, msg, uptimemillis);

}private boolean enqueuemessage(messagequeue queue, message msg, long uptimemillis)

return queue.enqueuemessage(msg, uptimemillis);

}

最終都會將message加入messagequeue中,此處需注意message的target物件會持有當前handler的引用。

public static void loop() 

// 省略部分**

msg.target.dispatchmessage(msg);

// 省略部分**

msg.recycleunchecked();

}}

可以看到looper的loop()方法會呼叫handler的dispatchmessage()方法。

public void dispatchmessage(message msg)  else 

}handlemessage(msg);

}}private static void handlecallback(message message)

如果message的callback物件不為空,則執行runnable(handler的post()系列方法)。

如果mcallback不為空,則呼叫mcallback的handlemessage()方法,否則直接呼叫handler的handlemessage()方法。

nginx原始碼分析 從原始碼看nginx框架總結

nginx原始碼總結 1 中沒有特別繞特別彆扭的編碼實現,從變數的定義呼叫函式的實現封裝,都非常恰當,比如從函式命名或者變數命名就可以看出來定義的大體意義,函式的基本功能,再好的架構實現在編碼習慣差的人實現也會黯然失色,如果透徹理解 的實現,領悟架構的設計初衷,覺得每塊 就想經過耐心雕琢一樣,不僅僅...

Handler原始碼解析

意思就是說 在沒有呼叫looper.prepare 之前不能在子執行緒建立handler。為什麼在主線程中我們就已經可以直接建立handler?因為在activity的啟動 中,已經在當前ui執行緒 主線程 呼叫了looper.preparemainlooper 和looper.loop 方法。我們...

handler原始碼分析

昨天研究了一下handler的原始碼,今天總結一下 android只有乙個執行緒可以操作ui介面,我們稱之為ui執行緒。每個ui執行緒都維護乙個looper,這個looper中有乙個messagequeue來儲存ui乙個訊息佇列。通過控制這個訊息佇列來實現對ui介面的順序重新整理。handler.s...