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后的处理顺序?
如果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方法后面的代码.
参考资料:
http://blog.csdn.net/luoshengyang/article/details/6817933
android4.4.4源码
- android的消息机制总结1
- android 消息机制的总结
- 对android消息机制的总结
- android的消息机制总结2
- Android的异步消息处理机制---Handler机制总结
- Android消息循环机制总结
- Android 消息机制 Handler总结
- Android消息传递机制总结
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android的消息机制
- Android 的消息机制
- Android的消息机制
- Android 的消息机制
- Android的消息机制
- JavaScript 传统 & 现代DOM加载
- tensorflow下运行softmax和CNN实例
- 好巧合啊
- 强大的vim配置文件,让编程更随意
- HDU 5773 The All-purpose Zero DP,贪心,LIS
- android的消息机制总结1
- Java--数组
- ViewPager基本原理
- CMakeLists.txt 实例
- 我的程序员之路(英语的学习)
- Runnable和Thread基础
- Java常见面试题
- array类型
- 一个递归算法