Looper
Looper 线程
public class LooperThread extends Thread {
@override
public void run(){
Looper.prepare();
Lopper.loop();
}
}
Looper.prepare()
每个线程中的Looperduixiang 其实是一个ThreadLocal,一个Thread只能有一个Looper对象,再次创建Looper将抛出异常
Looper.loop()
调用loop方法后,Looper线程不断从自己的MQ中取队头的消息执行
Handler
往MQ上添加消息和处理消息,及通知MQ它要执行一个任务(sendMessage),并在loop到自己的时候执行该任务(handleMessage),整个过程是异步的
一个线程可以有多个Handler,但是只能有一个Looper
Handler发送消息
post(Runnable), postAtTime(Runnable, long), postDelayed(Runnable, long), sendEmptyMessage(int), sendMessage(Message), sendMessageAtTime(Message, long)和 sendMessageDelayed(Message, long)这些方法向MQ上发送消息了。光看这些API你可能会觉得handler能发两种消息,一种是Runnable对象,一种是message对象,这是直观的理解,但其实post发出的Runnable对象最后都被封装成message对象了
Handler处理消息
消息的处理是通过核心方法dispatchMessage(Message msg)与钩子方法handleMessage(Message msg)完成的