handler 随笔
来源:互联网 发布:mac 删除windows分区 编辑:程序博客网 时间:2024/05/22 15:08
ThreadLocal是一个线程内部存储数据的泛型类,
消息处理机制的流程:
Looper实现原理
1.调用prepare()方法,内部创建 looper对象并放入ThreadLocal中,looper对象内部
。创建了ssageQueue
2.一般线程调用looper.prepare(), 主线程调用prepareMainLooper方法。
3.之后调用looper.loop()方法:
首先获取Looper对象,这里是从sThreadLocal获取的,对应的线程存放了自己内部的Looper对象。如果获取的Looper对象为null,则不会执行后续消息循环操作,如果不为空,则可以获取到looper对象中的消息队列,之前已经说明消息队列是在Looper的构造函数中初始化的,那么在此就可以获取到了mQueue。for是一个无限循环的操作,在调用MessageQueue的next方法,其作用是从消息队列中取出消息,在源码中有注释在此处可能会阻住,具体实现原理将在下一节中说明。如果消息队列中没有消息则退出循环操作。此循环中的核心代码msg.target.dispatchMessage(msg),target是一个Handler对象,这个对象就是发送消息的那个Handler对象,handler对象分发消息,在handler的dispatchMessage方法中会执行内部的处理消息的方法handleMessage()。消息分发完之后recycleUnchecked()执行消息的回收工作,将消息存入回收的消息池当中。
Message实现原理
Android应用程序是事件驱动的,每个事件都会转化成一个可以序列化的系统消息。而这个消息(Message)中包含了两个额外的整型数据字段和一个额外的对象字段。Message是一个可序列化的对象,what是Message的标识,如果需要存储的数据是int型的,那么可以存储到arg1,arg2,而需要存储序列化的对象时,可将数据存储到一个Bundle对象(data)中。
消息处理机制的流程:
1.首先在ActivityThread 中 调用,prepareMainLooper()方法,创建looper 对象 和 messageqeueu 对象。 之后执行loop方法,进行循环,遍历与之绑定的qeueu, 没消息阻塞,有消息就取出消息发送给对应的handler。
2.接收到消息的handler,调用dispatchmessage方法分发,然后调用handmessage方法来进行处理。
- handler 随笔
- Handler、Message、MessageQueue随笔
- Handler、Looper、Message随笔
- Android之——Handler随笔
- android随笔01——handler
- 浏览博客随笔——handler正确使用
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- 随笔
- Eclipse安装svn插件的几种方式
- 区块链和数字货币开发历史上发生哪些被黑事件
- java enum(枚举)使用详解
- Hdu 5187 zhx's contest【思维+快速幂+快速乘】
- 1004. Counting Leaves (30)
- handler 随笔
- 【行人识别】Deep Transfer Learning for Person Re-identification
- JAVA-7-形参及返回值、权限及内容修饰符、内部类(重点是匿名内部类)
- mysql添加图片
- android 横竖屏切换属性和播放视频全屏切换
- volatile
- Android实现类似C#ComBox功能用AutoCompleteTextView实现
- 安卓中OpenGL ES的初步应用
- 手把手教你如何安装Protocol Buffer