面试官最最常问的就是:
看过Handler源码吗?请简单说说Android线程间消息传递机制?
![](https://img.haomeiwen.com/i3117364/037732a08285014a.png)
这种情况下,首先我们要先理清回答的思路,然后用我们的结构化思维去征服面试官!(心虚~)
(一脸谄媚的)我:是这样的,Android线程间消息传递主要大体可以分为以下几个部分:消息发送、消息循环、消息分发,接下来我具体讲讲这三个部分的实现逻辑。
![](https://img.haomeiwen.com/i3117364/2395ad6fcb32364a.png)
1、消息是怎么发送的?
这个问题还可以进行引申:发送延迟消息的方式是延迟插入呢,还是延迟执行?具体回答我也写在流程图上了,自己总结吧~
![](https://img.haomeiwen.com/i3117364/36aefe550e85c71f.png)
2、怎么进行消息循环的?
![](https://img.haomeiwen.com/i3117364/3b768632f311ae5a.png)
从这里我们也可以知道,平时我们通过postDelay
发送的消息,是不会被精确执行的。
假设有一条消息执行时间太长,处理完它再来处理下一条消息的时候,可能已经过了下一条消息规定要执行的时间了。
3、怎么处理分发消息的?
消息发送这个流程很简单,就不画图了。祭上代码:
![](https://img.haomeiwen.com/i3117364/d262ab3f07827051.png)
用文字描述就是:
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 ,上图~
![](https://img.haomeiwen.com/i3117364/4e52feba1a808e4b.png)
![](https://img.haomeiwen.com/i3117364/0058f05a0ecf6189.png)
2、MessageQueue是怎么创建的?
答:MesageQueue是在底层调用native
方法去创建的,本质是一个单链表;
3、Handler的消息延迟是怎么实现的?
- 消息队列按照消息触发时间
(msg.when)
排序 - native通过设置
epoll_wait
的超时时间,使其在特定时间唤醒 - 延时精度其实不高
4、了解过IdleHandler吗?能说说原理?
关于IdleHandler
在下篇文章结合源介绍,这里大家就先知道IdleHandler
可以实现是当主线程的空闲时执行逻辑的一种方式。
本文不足
其实线程通信还涉及到很多native层的交互,完整的架构应该是这样的:
![](https://img.haomeiwen.com/i3117364/f63622c7eecb84c2.png)
大家有兴趣可以去看gityuan大神的文章,五星推荐~~~
当然,面试的时候面试官问的问题可不止这一个,不论是什么样的大小面试,要想不被面试官虐的不要不要的,只有刷爆面试题题做好全面的准备,当然除了这个还需要在平时把自己的基础打扎实,这样不论面试官怎么样一个知识点里往死里凿,你也能应付如流啊~
贴心的我给大家带来了面试题合集
【2017-2019字节跳动面试真题解析&简历制作PDF模板】
针对字节跳动的面试题整理的,进行了分类,循序渐进,由基础到深入,由易到简。
将内容整理成了五个章节、计算机基础面试题、数据结构和算法面试题、Java面试题、Android面试题、其他扩展面试题、非技术面试题总共五个章节354页。
每个问题都附上1个标准参考答案,都是反复摸索消化(真心花了很多时间),觉得写的比较好的文章作为答案。
来节省大家自己去搜索的时间,把时间用在正确的东西上。。
还整理了全套简历制作、春招困惑、HR面试等问题解析参考建议,都是福利分享给大家。
【2017-2019字节跳动面试真题解析&简历制作PDF模板】关注我看个人介绍,或直接简信我免费领取
网友评论