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...