android的消息机制总结1

来源:互联网 发布:网络40禁书百度 编辑:程序博客网 时间:2024/05/29 10:54

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后的处理顺序?

  1. 如果Message的Runnable类型的callback成员不为null,那么直接调用callback的run方法,处理结束;

  2. 如果Handler对象的Handler.Callback类型的mCallback对象不为null,那么直接调用mCallback的handleMessage方法,处理结束;

  3. 调用Handler对象的handleMessage方法.

Handler类的handleMessage方法为空实现,所以一般需要继承Handler类,重写其handleMessage方法

注意点:

Looper对象的loop方法执行后,要等到调用Looper对象的quit或者quitSafely方法才会执行loop方法后面的代码.

参考资料:

  1. http://blog.csdn.net/luoshengyang/article/details/6817933

  2. android4.4.4源码

0 0
原创粉丝点击