handler机制原理之精简版
来源:互联网 发布:天心软件集团 编辑:程序博客网 时间:2024/05/25 05:35
handler机制精简版,通俗易懂!
在应用启动的时候,会启动ActivityThread,在其main方法中
Looper.prepareMainLooper()prepare方法是在prepareMainLooper中调用的,prepare里面主要是进行setLooper
在往ThredLocal里setLooper
时发现,Looper是直接new出来的,并且在Looper的私有构造方法中new出了消息队列
此时
handler.sendMeassage 调用sendmessageDealay,最终会调用sendMessageAtTime
queue.enquenueMessage是会将消息放入消息队列去
p=mMessages
when<p.when
p指当前队列的第一条消息,要放入的消息的时间比当前队列的第一条消息的时间短,则插入到最前端
msg.next=p
mMessages=msg;(mMessage是第一条消息
而
Looper.loop方法中获取消息然后再分发消息
msg.target.dispatchMessage(msg)
message对象的target属性,就是handler对象 记录该消息是由谁创建,在obtain方法中赋值
在分发消息方法体里,如果消息处要理,则会调用handlermessage,再唤醒主线程
创建Handler对象时,在构造方法里调用带有布尔值的构造方法,其里面有一个Looper.myLooper和mLooper.mQueue
拿到Looper和消息队列
查看myLooper方法体,发现looper对象是通过ThreadLocal得到的
Looper.loop方法中有一个while死循环
在里面的一个死循环中,queue.next从消息队列中获取一条消息
当消息队列中没有消息时,则会阻塞主线程,但不会报错误
因为在linux的一个进程间通信机制:管道(Pipe)
原理:在内存中有一个特殊的文件,这个文件有两个句柄(引用),一个是读取句柄,一个是写入句柄,
读取句柄从管道文件中读取的.
主线程looper从消息队列读取消息,当读完所有消息时,进入睡眠,主线程阻塞,
子线程中往消息队列中发送消息,不会唤醒主线程,它会往管道文件中写数据,随即
唤醒主线程,主线程会继续从管道中读取数据,主线程被唤醒只是为了读取消息,当消息读取完毕,会再次睡眠.
0 0
- handler机制原理之精简版
- handler机制的原理
- handler机制的原理
- handler机制的原理
- handler机制的原理
- handler机制的原理
- handler机制的原理
- handler机制的原理
- andriod Handler机制原理
- handler机制的原理
- handler机制的原理
- handler机制原理
- handler机制的原理
- handler机制原理
- handler机制的原理
- handler机制的原理
- Handler机制原理
- handler机制的原理
- iframe中js创建dom,高度自适应
- 随笔(2015.12)
- 高精度运算
- 手机网络
- Windows Store App异步返回刷新页面
- handler机制原理之精简版
- Windows7内置搜索,同时搜索文件名以及文件里面的内容
- python文件操作
- [Android]OkHttp的简单封装-辅助框架
- Java高级特性之泛型
- CMake安装配置OpenCV3.1
- [生活] 2015年终总结,2016开篇计划
- Android全屏或者取消标题栏 以及可能出现问题
- EL表达式总结