Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制


面试官最最常问的就是:
看过Handler源码吗?请简单说说Android线程间消息传递机制?
Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
本文插图
=
这种情况下 , 首先我们要先理清回答的思路 , 然后用我们的结构化思维去征服面试官!(心虚~)
(一脸谄媚的)我:是这样的 , Android线程间消息传递主要大体可以分为以下几个部分:消息发送、消息循环、消息分发 , 接下来我具体讲讲这三个部分的实现逻辑 。
Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
本文插图
1、消息是怎么发送的?
这个问题还可以进行引申:发送延迟消息的方式是延迟插入呢 , 还是延迟执行?具体回答我也写在流程图上了 , 自己总结吧~
Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
本文插图
【Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制】
2、怎么进行消息循环的?
Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
本文插图
从这里我们也可以知道 , 平时我们通过postDelay发送的消息 , 是不会被精确执行的 。
假设有一条消息执行时间太长 , 处理完它再来处理下一条消息的时候 , 可能已经过了下一条消息规定要执行的时间了 。
3、怎么处理分发消息的?
消息发送这个流程很简单 , 就不画图了 。 祭上代码:
Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
本文插图
用文字描述就是:
1、当msg.callback不为空时 , 回调msg.callback.run()方法
2、当handler的mCallback成员变量不为空时 , 则回调方法 mCallback.handleMessage(msg) , 如果返回true , 直接结束;否则 , 执行步骤3
3、调用Handler自身的handleMessage() , 也就是我们经常复写的方法;
其他问题
1、子线程的Looper和主线程的Looper有什么区别?
答:
子线程的Looper可以退出 , 主线程的Looper不可以退出
子线程的Looper你要自己去prepare , 自己去创建 , 但是主线程的Looper默认帮你创建了
talk is cheap, 上图~
Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
本文插图
Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
本文插图
2、MessageQueue是怎么创建的?
答:MesageQueue是在底层调用native方法去创建的,本质是一个单链表;
3、Handler的消息延迟是怎么实现的?
消息队列按照消息触发时间(msg.when)排序
native通过设置epoll_wait的超时时间 , 使其在特定时间唤醒
延时精度其实不高
4、了解过IdleHandler吗?能说说原理?
关于IdleHandler在下篇文章结合源介绍 , 这里大家就先知道IdleHandler可以实现是当主线程的空闲时执行逻辑的一种方式 。
本文不足
其实线程通信还涉及到很多native层的交互 , 完整的架构应该是这样的:
Android01■面试官:看过Handler源码吗?请简单说说安卓线程间消息传递机制
本文插图
大家有兴趣可以去看gityuan大神的文章 , 五星推荐~~~
当然 , 面试的时候面试官问的问题可不止这一个 , 不论是什么样的大小面试 , 要想不被面试官虐的不要不要的 , 只有刷爆面试题题做好全面的准备 , 当然除了这个还需要在平时把自己的基础打扎实 , 这样不论面试官怎么样一个知识点里往死里凿 , 你也能应付如流啊~