Handler 基础篇
看看与你了解的Handler是不是不同,欢迎来挑刺
这个系列以分享总结为主,希望能精简的讲清楚Android相关的机制,
有什么问题或者意见,欢迎评论和私信联系我
相关文章
感谢下面文章的大佬给出启发灵感和技术分享,欢迎交叉阅读不同博客的看法,这样才能找到合适的自己的理解方式
Carson_Ho 图文解析 Handler通信机制 的工作原理
内容预览
心急的同学 可以点击右侧菜单跳转
一、Handler是什么?
二、为什么Android要设计Handler
三、Handler 工作流程
四、总结思考
一、Handler是什么?
-
Android中一套很重要的消息传递机制。
为什么重要?
因为,除了我们自己的消息以外,Android系统本身许多通讯也是通过Handler,比方说画面的绘制、界面点击事件、activity跳转等等全部都要靠handler机制维护,所以说,这是一套非常重要的消息传递机制。
( ̄へ ̄ ) 思考一下,共用一套消息机制,消息多了,会不会有什么问题?
二、为什么Android要设计Handler?
- 在之后某一个时间点,运行一段程序或者发送一条消息1
- 线程间通讯
平时的使用中,相信都有感受到Handler.postDelay()用的是有多么的爽,这就是handler给我们带来的便利性;
线程间通讯,这部分留到下回分解,饭要一口一口吃~
三、Handler 工作流程
1. 设计思路
整体设计思路可以理解为像是邮件投递这样一个机制,发件人发出去消息,投放到信箱,邮递员负责通过邮件上的消息,找到收件人,然后发出去。
如果还是不太理解,看看第二个例子,传送带模型,意思差不多,我就不细讲了。
2. 关键成员
上述例子中,引出几个Handler机制的关键成员
- 发件人/收件人 = Handler
- 信息 = Message
- 信箱 = MessageQueue
- 邮递员 = Looper
① Handler
负责消息发送与接收
② MessageQueue
消息队列,主要用于消息的存取。
③ Looper
循环器,消息处理的中枢,不断从消息队列(MessageQueue)中取出消息,分派给对应的Handler,直到quit才停止。
④ Message
消息类,整个Handler消息机制中,传递的就是Message。
3. 具体流程
3.1 图解
先 上 图
- 说明:
先看红色部分
发送消息
post和sendMessage最终使用 Handler 的 sendMessageAtTime 发送 Message放入队列
调用 MessageQueue 的 enqueueMessage ,放入队列中唤醒
enqueueMessage 内部的 nativeWake 方法,可以理解为,唤醒 next 方法中的 nativePollOnce ,next函数就会往下走
再看绿绿绿色部分
获取
线程中Looper的loop一直不停调用 MessageQueue.next 获取下一条 Message阻塞待唤醒
如果没有消息,就 nativePollOnce 阻塞信息返回
唤醒了,next函数接着走拿到下一条 Message ,返回给 loop回调给Handler处理
loop拿到 Message ,找到 Message 对应的 Handler ,回调给 dispaatchMessage ,让 Handler 自己处理
3.2 方法调用链
如果不理解可以换个角度,看看方法调用链
发送过程:
Handler.sendMessgae()/post() --- 发送消息前,对消息的一些封装,如post方法封装到callback
|__Handler.sendMessageAtTime() --- 最终其实都是调用同一个方法
|__MessageQueue.enqueueMessage() --- 消息加入队列
取出过程:
Looper.loop() ---线程循环获取信息分发
|__MessageQueue.next() --- 获取下一条,没消息就阻塞
|__Handler.dispatchMessage() --- 分发回去
总结与思考
Handler无非就是一套消息通讯机制,原理还是很好懂的。
但是懂了工作原理之后,好奇的我们并不满足,会有很多疑问对吧?比方说:
Handler 为什么能线程切换?根本的原理是什么?
Looper 存在什么地方?有一个还是多个?
共用一套消息机制,消息多了,会不会有什么问题?
阻塞不会卡住整个线程吗?
......
别急,下一篇会细细分析。
当然如果关于Handler您有什么疑问或者吐槽,直接评论就可以了,随便写点什么,让我知道我写的怎么样吧,感谢!