android为什么要使用消息队列模式(Looper,Handler,Message)?
这是一种异步机制,消息发送方不需要等到消息处理完成就可以直接返回.
当消息队列为空时能够阻塞等待,直到有消息时再处理.因为实际使用App时,大多数情况下需要等待用户输入(例如触屏事件).
可以很方便地给其他线程发送消息,从而在其他线程中执行代码.
Looper,Handler,Message都是啥?
Looper拥有一个消息队列MessageQueue,调用loop方法后它循环地从自己的MessageQueue中取出Message处理,当没有Message时就阻塞等待(需要注意的是MessageQueue中的Message并不是严格按照加入顺序排列的,而是按照Message需要被处理的时间排序的).
Handler有两个任务:发送和处理Message,一个Handler发送的所有消息都由自己处理.
Message是消息的携带者,主要的成员有int类型的what,arg1,arg2, Object类型的obj, Runnable类型的callback,其中callback要在Message构造时或通过Message的静态方法obtain获取Message时设置,其他成员可以直接访问修改.
线程,Looper,Handler,Message的对应关系?
一个线程中最多只能存在一个Looper(UI线程自动产生一个Looper,其他线程如果使用Looper需要手动添加代码处理).
一个Looper可以对应多个能够发送和处理Message的Handler.
一个Handler只能与一个Looper相对应,也就是只能与一个线程对应(Handler内部也有一个MessageQueue的引用,它就是自己Looper所使用的那个MessageQueue,Handler就是通过这个MessageQueue向自己的Looper发送消息的)
向Handler发送Message之后这个消息在哪个线程处理?
在Handler对应的Looper所在的线程执行.
如何让一个Handler与一个Looper(或者说线程)绑定?
这由构造Handler对象时使用的Looper对象决定,如果使用没有Looper参数的构造方法那么其Looper就是构造时线程所在的Looper.
Handler收到Message后的处理顺序?
如果Message的Runnable类型的callback成员不为null,那么直接调用callback的run方法,处理结束;
如果Handler对象的Handler.Callback类型的mCallback对象不为null,那么直接调用mCallback的handleMessage方法,处理结束;
调用Handler对象的handleMessage方法.
Handler类的handleMessage方法为空实现,所以一般需要继承Handler类,重写其handleMessage方法
注意点:
Looper对象的loop方法执行后,要等到调用Looper对象的quit或者quitSafely方法才会执行loop方法后面的代码.
参考资料: