Looper
Looper 線程
public class LooperThread extends Thread {
@override
public void run(){
Looper.prepare();
Lopper.loop();
}
}
Looper.prepare()
每個(gè)線程中的Looperduixiang 其實(shí)是一個(gè)ThreadLocal,一個(gè)Thread只能有一個(gè)Looper對(duì)象梨水,再次創(chuàng)建Looper將拋出異常
Looper.loop()
調(diào)用loop方法后享甸,Looper線程不斷從自己的MQ中取隊(duì)頭的消息執(zhí)行
Handler
往MQ上添加消息和處理消息陵像,及通知MQ它要執(zhí)行一個(gè)任務(wù)(sendMessage),并在loop到自己的時(shí)候執(zhí)行該任務(wù)(handleMessage),整個(gè)過程是異步的
一個(gè)線程可以有多個(gè)Handler知举,但是只能有一個(gè)Looper
Handler發(fā)送消息
post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long)和 sendMessageDelayed(Message, long)這些方法向MQ上發(fā)送消息了。光看這些API你可能會(huì)覺得handler能發(fā)兩種消息添坊,一種是Runnable對(duì)象剿另,一種是message對(duì)象,這是直觀的理解帅腌,但其實(shí)post發(fā)出的Runnable對(duì)象最后都被封裝成message對(duì)象了
Handler處理消息
消息的處理是通過核心方法dispatchMessage(Message msg)與鉤子方法handleMessage(Message msg)完成的