当前位置:网站首页>差点被这波Handler 面试连环炮带走~
差点被这波Handler 面试连环炮带走~
2022-06-25 06:40:00 【码中之牛】

Handler 是 Android 中最高频使用的消息机制,这些年在大厂的面试过程中,碰到的越来越多了。虽然碰到的多但是能完成解答出来的朋友却很少,怎么回事呢?
其实原因不言而喻,大厂对Handler的面试题都有一定的深度。而且喜欢扣细节;
例如我之前文章讲到,Handler 的 runWithScissors() 可以实现 A 线程向 B 线程发送一个消息,使 A 线程进入阻塞,等待 B 线程处理完消息后再继续执行。那么延伸出来的 2 个问题就是;
runWithScissors() 的原理是什么?
它被标记为 @hide 不允许使用是因为存在什么问题吗?
再比如,我们知道 MessageQueue,实则是一个基于触发时间 when 的优先级消息队列。那么在什么场景下,MessageQueue 中靠后的消息,会先于靠前的消息,被调度执行呢?
这些问题,若是不看源码,只停留在使用层面,基本上很难捋清楚。

1:Handler 机制中,存在哪些角色?各自承担了什么功能?
- Handler:消息辅助类 & 对外的接口 & 向 MQ 投递消息 & 消息的目标处理者;
- Message:消息的载体 & 被 Handler 投递 & 自带 Handler 处理 & 自带消息池;
- Looper:循环器 & 持有 MQ & 循环从 MQ 中获取消息 & TLS 线程唯一;
- MessageQueue:基于时间的优先级队列 & 链表结构 & Java 与 C++ 层的纽带;
2:Handler 分发事件优先级,是否可拦截?拦截的优先级如何?
Handler 中,通过 dispatchMessage() 处理消息,其中存在优先级策略;
- 优先级1:msg,callback,run() - 独占;
- 优先级2:mCallback.handleMessage(msg) - 返回值决定是否拦截该消息;
- 优先级3:handle.handleMessage();
3:主线程 Looper 何时运行?
App 启动时,会调用到 ActivityThread 中,Looper 就在其 main() 方法中被启动;main() 中会主动调用 Looper.prepareMainLooper() 和 Looper.loop();Tips:ActivityThread 不继承自 Thread,它只是一个运行在主线程上的对象;
4:Handler 的 Message 可以分为那 3 类?分别有什么标识?
- 同步 Message:普通 Message;
- 异步 Message:msg.setAsynchronous(true)
- 同步屏障:msg.target == null
5:同一个 Message 对象能否重复 send?
关键在于如何定义同一个 Message。
- 角度一:Java 对象层面,可被复用;
原因:Message 由消息池维护,即同一个对象被回收后会被再次复用;| new Message & Message.obtain() - 角度二:业务层面,不能复用;
原因:Message 通过 enqueueMessage() 入队时,会通过 markInUse() 标记,再次入队无法通过 isInUse() 检查,则抛出异常;
我这里总结了BAT大厂关于Handler 的超过 100+ 高频面试题,现已经整理成了高清的PDF学习文档,有需要的可以 私信回复我 666即可取货!!!基本涵盖了各个角度,大家可以拿来自测一下。在面试前也可以刷一刷,毕竟 Handler 面试题虽高频出现,但是遇到还是不用慌张的。
6:场景:MessageQueue 是基于触发时间 when 的优先级队列,那么什么情况下,队列中靠后的消息会优先得到执行?原理是什么?
- 场景:靠前的消息是同步消息,靠后的消息是异步消息,且消息队列的队头为同步屏障;
- 原理:同步屏障会阻塞 MQ 中的同步消息,优先处理异步消息;
7:Message 的同步屏障有什么用?有什么意义?如何发送一个同步屏障?
- 用途:阻塞 MQ 对同步 Message 的分发,优先处理异步消息,没有异步消息时则进入休眠,直到同步屏障被移除;
- 意义:允许异步消息优先于同步消息执行;
- 同步屏障:特殊的 Message,target == null,无法通过 Handler 入队出队,需直接操作 MQ;入队:postSyncBarrier():返回一个屏障 token;出队:removeSyncBarrier()
8:什么是异步消息?如何发送?
- 意义:需配合同步屏障使用,否者与同步消息无区别;
- 异步消息:setAsynchronous(true) → 向 flags 添加 FLAG_ASYNCHRONOUS 标记
发送方式 通过异步 Handler 发送 → 构造 Handler 时,async 传递 true 发送消息前,主动调用 setAsynchronous(true)
安全起见,Android 9.0 普通开发者无法使用异步消息,所有发送方式被标记为 @hide
9:Handler 的 IdleHandler 机制,如何理解?有什么用途?
接口,需实现 queueIdle() 方法 & 定义在 MQ 中 & 以 MQ mIdleHandlers 维护存储
- 用途:可在 MQ 即将空闲时,处理任务;
- 逻辑点:MQ.next() 中,当前无待执行消息时,执行 mIdleHandlers;
依据 queueIdle() 返回值分:持续回调(true) & 一次性回调(false),false 会导致执行完后,从 mIdleHandlers 中移除
10:IdleHandler 执行耗时会影响正常的消息分发吗?Handler 内部如何处理?
会;IdleHandler 的耗时不可控;执行完后会重置 nextPollTimeoutMillis = 0,重新分发最近消息
11:移除消息的 removeMessage() 为什么需要两次循环?
优化效率;
- while-1:移除消息 & 找到下一个待处理的消息,存入 mMessages 中;
- while-2:从 mMessages 开始,移除后续符合条件的消息;
12:Handler 的 runWithScissors() 可实现 A 线程阻塞等待 B 线程处理完消息后再继续执行的功能,它为什么被标记为 hide?存在什么问题?原因是什么?
- 实现:将 Runnable 包装为 BlockingRunnable,其内通过 synchronized + wait 进入等待,待 r 执行完后,调用 notifyAll() 唤醒等待队列的子线程,子线程继续执行;
- 问题:在子线程 Looper 中使用,可能导致 A 线程进入 wait 等待,而永远得不到被 notify 唤醒;
- 原因:子线程 Looper 允许退出,若包装的 BlockingRunnable 被执行前,MessageQueue 退出,则该 runnable 永远不会被执行,则会导致 A 线程一直处于 wait 等待,永远不会被 notify 唤醒;
13:Looper.loop 中,如果没有待处理的消息,为什么不会阻塞 UI?
主线程在 MessageQueue 没有消息时,会阻塞在 loop 的 queue.next() 方法中的 nativePollOnce()方法里。
此时主线程会释放 CPU 资源进入休眠状态,直到下一个消息到达或者有事务发生,通过往 pipe 管道写端写入数据的方式,来唤醒主线程。这里采用的是 epoll 机制。
epoll 机制是一种 IO 多路复用机制,可以同时监控多个描述符,在有事件发生的时候,立即通知相应程序进行读或写操作,类似一种 callback 的回调机制。主线程在大多数时候是处于休眠状态,并不会消耗大量的 CPU 资源。当有新的消息或事务到达时,会立即唤醒主线程进行处理,所以对用户来说是无感知的。
14:如果 Java 层 MQ 中消息很少,但是响应时间却很长,是什么原因?
MQ 队列中,该 Message 前的 Message 处理较为耗时;Native 层消息过多,Java 层 MQ 消息优先级最低,最后处理;
15:Looper 的 Printer 输出的日志,有什么其他用途?依靠的原理是什么?有什么缺点?
- 用途:性能监控;
- 原理:通过筛选日志内存,区分 Message 的开始执行和结束执行的时间点,即可判断处理 Message 的耗时,即主线程卡顿耗时;
- 缺点:Printer 存在大量字符串拼接,在消息量大时,会导致性能受损;| 实测数据:存在 Printer 时,在列表快速滑动时,平均帧率降低 5 帧;
16:Handler 可以 IPC 通信吗?
不能;Handler 只能用于共享内存地址的 2 个线程通信,即同进程的 2 个线程通信;
17:Handler 为什么需要使用底层的 epoll 来休眠?
需要兼顾 Native 层的消息,消息可能来自底层硬件;如果只考虑 Java 层,notify/wait 即可实现;
我这里总结了BAT大厂关于Handler 的超过 100+ 高频面试题,现已经整理成了高清的PDF学习文档,有需要的可以 私信回复我 666即可取货!!!基本涵盖了各个角度,大家可以拿来自测一下。在面试前也可以刷一刷,毕竟 Handler 面试题虽高频出现,但是遇到还是不用慌张的。

边栏推荐
- Runtime——methods成员变量,cache成员变量
- VectorDraw Developer Framework 10.10
- 数据可视化没有重点怎么办?
- Sichuan Tuwei ca-is3105w fully integrated DC-DC converter
- Let's talk about MCU crash caused by hardware problems
- 【批处理DOS-CMD命令-汇总和小结】-外部命令-cmd下载命令、抓包命令(wget)
- 【批处理DOS-CMD命令-汇总和小结】-上网和网络通信相关命令(ping、telnet、nslookup、arp、tracert、ipconfig)
- 图扑软件数字孪生 3D 风电场,智慧风电之海上风电
- keepalived監控進程,自動重啟服務進程
- C Getting Started tutorial
猜你喜欢

【批處理DOS-CMD命令-匯總和小結】-cmd擴展命令、擴展功能(cmd /e:on、cmd /e:off)

Why "New Year's Eve", the original memory burst!
![[batch dos-cmd command - summary and summary] - CMD window setting and operation commands (CD, title, mode, color, pause, CHCP, exit)](/img/8c/7345b4e8a55dcf11d18ac113df4fc2.png)
[batch dos-cmd command - summary and summary] - CMD window setting and operation commands (CD, title, mode, color, pause, CHCP, exit)

Sichuan earth microelectronics ca-is1300 isolated operational amplifier for current detection is on the market

OAuth 2.0一键登录那些事

【批處理DOS-CMD命令-匯總和小結】-外部命令-cmd下載命令、抓包命令(wget)

Debian introduction

Chuantu microelectronics 𞓜 subminiature package isolated half duplex 485 transceiver
![[distillation] pointdistiller: structured knowledge distillationwards efficient and compact 3D detection](/img/5c/ad42474a363c33ecc0e01890b65bbf.png)
[distillation] pointdistiller: structured knowledge distillationwards efficient and compact 3D detection

My debut is finished!
随机推荐
14 bs对象.节点名称.name attrs string 获取节点名称 属性 内容
数据可视化没有重点怎么办?
图扑软件数字孪生 3D 风电场,智慧风电之海上风电
Explain distributed raft with dynamic diagram
用动图讲解分布式 Raft
Without "rice", you can cook "rice". Strategy for retrieving missing ground points under airborne lidar forest using "point cloud intelligent mapping"
Several good weather plug-ins
Path planner based on time potential function in dynamic environment
Why "New Year's Eve", the original memory burst!
我的处女作杀青啦!
OpenMP入门
RTKLIB-b33版本中GALILEO广播星历存储问题
指南针可以开股票账户吗?安全吗?
[Batch dos - cmd Command - Summary and Summary] - External Command - cmd Download Command, wget Command
Summary of small problems in smartbugs installation
Understand the reasons for impedance matching of PCB circuit board 2021-10-07
Pit encountered by pytorch: why can't l1loss decrease during model training?
音频(五)音频特征提取
不同路径II[针对DFS的动态规划改进]
[batch dos-cmd command - summary and summary] - external command -cmd download command and packet capture command (WGet)