一、Looper
涉及到的方法:prepare()、loop()
prepare():静态方法,内部执行Looper构造方法,创建Looper实例,保证一个线程只有一个Looper实例存在
Looper构造方法:构造方法内部创建了一个MessageQueue(消息队列)对象
执行完prepare之后,就可以拿到Looper对象实例了,Looper构造方法中又去创建了一个MessageQueue(消息队列),保证了一个线程只有一个Looper对象和一个MessageQueue(消息队列)
loop():无线循环,不停的从MessageQueue(消息队列)中取消息,拿到消息之后交给Handler去Dispatcher(分发),如果消息队列中没有消息,则处于阻塞状态
二、Handler
构造方法:内部调用Looper.myLooper(),获取到Looper对象,因为创建Looper对象的时候在构造方法中又去创建了MessageQueue(消息队列),所以Handler就与Looper和MessageQueue关联起来了
sendMessage(Message msg):内部会调用sendMessageDelayed(Message msg,long delayMillids),最后调用MessageQueue的enqueueMessage(msg, uptimeMillis),将消息保存到消息队列中,MessageQueue读取到Message之后会回调dispatchMessage(Message msg),dispatchMessage中又会回调handlerMessage(Message msg)
Message.obtain():内部维护了一个Message池,对Message对象进行复用