Handler、MessageQueue、Runnable和Looper相信大家在Android开发过程中这四个类一定不陌生,但是面试的时候经常问道。我们先来看张图:
再来看看这张图
从上面两张图片我们可以看出,Runnable和Message都在MessageQueue里面,然后Looper从MessageQueue里面获取交给Handler来处理,到最后活的结果。需要注意的是:MessageQueue里面存放的Object一定是同类型的。总结一句话就是:
Looper不停的从MessageQueue里面获取Message,然后交给Handler处理,并得到相应结果。
说到Handler我们不得不提一下Thread了,我们再看另张图片:
可以总结为:
- 每个Thread对应一个Looper
- 每个Looper对应一个MessageQueue
- MessageQueue里面可以有多个Message
- 每个Message最多指定一个Handler
所以Thread和Handler是一对多的关系!接下来我们具体看看Handler
public void dispatchMessage(Message msg); //Message分发处理
public void handlerMessage(Message msg); //处理Message
首先Looper从MessageQueue获取Message会先调用Handler.dispatchMessage分发消息,所以在我们特定需求来重新dispatchMessage和handlerMessage来改变它的默认行为。Handler发送消息有send和post两种方式,send和post的区别:send和post都是将message压入Messagequeue,而send是直接处理的函数参数是Message;post则是先把其他类型的“零散”信息转换成Message,在调用send系列函数来执行下一步操作。