標籤:
Handler建立,必須有個一個Looper,主線程自己建立了。其他線程需要自己建立,預設是沒有的。建立方法
1. 這種方法是先建立一個系統定義好的HandlerThread,這個是跑在非UI線程中的,已經建立好了looper,直接用就可以了.建立handler有多個建構函式,具體看源碼
HandlerThread threadhandler = new HandlerThread("1111");
threadhandler.start();
myhandler = new myHandler(threadhandler.getLooper());
2. 自己建立一個新的線程,線上程中調用Looper.prepare();然後寫處理message回調方法,接著還要調用looper.loop();
class LooperThread extends Thread {
public Handler mHandler;
public void run() {
Looper.prepare();
mHandler = new Handler() {
public void handleMessage(Message msg) {
// process incoming messages here
}
};
Looper.loop();
}
}
為什麼一定要有一個Looper呢?
因為handler的無參數建構函式裡需要looper,如果為空白就拋異常。
如何設定looper?
調用Looper.prepare();這裡會判斷當前的線程是不是已經有looper了,有的話會拋異常,這就是說一個線程只能有一個looper。
Message是什麼,有什麼用?
存放訊息的用的,它有很多屬性。特別說明target,表示的就是處理它的handler,next屬性,這就是利用了鏈表結構來構造的訊息佇列,message.next表示著當前訊息的下一個,是按照時間來的,只能順序不能反過來,他沒有prev屬性。
MessageQueue是什麼,有什麼用?
用來操作messages,例如handler發送訊息過來,他需要把訊息按照順序串起來。還有處理完訊息後他需要把訊息從訊息佇列中刪除等等。
handler有什麼用?
發送和處理訊息。handler通過sendmessage等方法發送訊息,最終都是通過sendMessageAtTime來處理髮送給MessageQueue。然後通過looper回呼函數msg.target.dispatchMessage(msg)-->handler的handleMessage()方法具體處理。
handler還可以使用post方法將runnable傳給訊息佇列message有callback屬性,在looper的dispatchMessage()方法中,如果是runnable就直接run()了;
最後有個疑問:到底是什麼樣的機制可以讓looper迴圈去處理message?
while (true) {
Message msg = queue.next(); // might block
if (msg != null) {
if (msg.target == null) {
return;
}
if (me.mLogging!= null) me.mLogging.println( ">>>>> Dispatching to " + msg.target + " "
+ msg.callback + ": " + msg.what );
msg.target.dispatchMessage(msg);
if (me.mLogging!= null) me.mLogging.println( "<<<<< Finished to " + msg.target + " "
+ msg.callback);
msg.recycle();
}
看到Message msg = queue.next(); // might block 這句話,獲得待處理的message,這裡可能會堵塞,沒有message的時候就迴圈等待,直到messageQueue退出
android-handler、looper、messageQueue、message