Handler MessageQueue Looper之间的关系?
1、MessageQueue 中的
enqueueMeassage:相当于往单链表中添加消息
next:从单链表中取出并且删除消息
2、Looper主要进行消息循环,会不断地从MessageQueue中取出消息,
Handler的工作需要Looper,Looper.prepare()
一、创建Looper的方法?
1、Looper.prepare:在子线程中创建Looper
2、Looper.getMainLooper:给主线程也就是ActivityThread创建Looper的,Looper.getMainLooper可以在任何地方获取主线程的Looper
二、Looper的退出?
Looper.quit:直接退出
Looper.quitSafely:设定一个标志,把消息队列中已经有的消息全部处理完成之后在退出
三.Looper取出对象
looper:通过死循环来取出消息
四、Handler为什么可以切换线程?
因为Looper.loop方法中调用了msg.target.dispatchmessage(msg)。msg.target就是发送这条消息的Handler,所以相当与Handler.dispatchmessage方法是在Looper所在地线程调用的.
3、Handler
handler.sendmessage 就相当于发送一条消息到消息队列中
–>MessageQueue.enqueueMeassage/ 而MessageQueue中的next的无线循环中Looper发现新消息后就会取出这条消息–》Looper.loop---->Hnadler.dispatchMessage—>Handler.handleMessage