Android_handler源码分析,及介绍
来源:互联网 发布:芜湖 网络推广专员 编辑:程序博客网 时间:2024/05/17 09:44
解决了 线程间通讯问题 (三种通讯方式, handler在哪个线程创建)
1.Handler: 推送消息到Message Queue里;或者接收Looper从Message Queue取出,所送来的消息。
2. Message Queue(消息队列):用来存放线程放入的消息。
3.Looper: 一个线程可以产生一个Looper对象,由它来管理此线程里的Message Queue(消息队列)。
介绍handler机制流程
一个线程只能对应一个looper和messageQueue 可以有多个handler(Google不建议我们使用多个,容易造成 内存泄漏)
handler可以在不同线程中创建,但是子线程的handler发送的消息,主线程不能接收到. 因为如上;
源码:
1.handler不同参数的构造都只调用了一个构造
首先调用Looper.myLooper()获取当前线程的looper,获取获取消息队列 如果当前线程不存在会报让你调用Looper.perpare()异常
application源码 中默认调用了如上方法 application的onCreate的方法在主线程中
2.obtainMessage(三种创建msg): 创建Message 都是调用Message.obtain()方法,首先在消息池在中取消息,如果没有就创建一个消息. message内部都保存了对handler的引用,Looper根据引用知道是哪个handler发送的消息,然后分发消息执行回调(两种回调)
首先从消息池中获取消息 返回当前消息 指向下一个消息 单链表的下一个消息置为空
最大消息池10个
清理消息:将消息对象的所有属性置为空后 指向单链表的下一个消息
本身就是单链表 对消息完成复用(回收消息:清空消息的属性)
3.sendMessage: (不同参数)都调用的是sendMessageDelayed() 然后调用
(发消息最终是由)sendMessageAtTime()
也调用又调用了enqueueMessage()存放消息,并且按消息的时间排序
获取到消息唤醒消息队列
4.post:--->走的是sendMessage,给message添加了callback的标记(存放的是runabler任务)runabler是在主线程中执行的.
5.removeMessages: 移除等待执行的message 因为Looper一次只能执行一个message
6.removeCallbacks: 执行的是如上方法 移除等待执行的message只是传了一个runnabler根据这个找到对应message
7.dispatchMessage:Looper拿到message的实例后调用,是在主线程中调用的
runOnUIThread:判断是不是在主线程,在主线程就直接调用run方法,不再就handler.post
- Android_handler源码分析,及介绍
- Android_Handler源码分析
- Android_Handler
- android_Handler
- Android_Handler
- Android_Handler
- Android_Handler
- Android_Handler
- Spring AOP介绍及源码分析
- Spring AOP介绍及源码分析
- Spring AOP介绍及源码分析
- Spring AOP介绍及源码分析
- Spring AOP介绍及源码分析
- Spring AOP介绍及源码分析
- Spring AOP介绍及源码分析
- Spring AOP介绍及源码分析
- AsyncTask介绍及源码执行过程分析
- ByteArrayInputStream的介绍,源码分析及示例
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- Android_PackageInstall源码分析&静默安装
- java面试题十 string字符串操作
- Http相关介绍
- 2、SecureCRT中文乱码问题
- Android_handler源码分析,及介绍
- Java数据结构与算法
- 初学Python-第五章练习题
- Java反射
- java面试题十一 基本数据类型
- Egret杂记
- 93 c 访问结构体成员
- 四 NoteList.java
- AutowireCapableBeanFactory,实现不必配置xml文件,动态加载bean