Handler如果没有消息处理是阻塞的还是非阻塞的?(字节跳动、小米)
这道题想考察什么?
这道题想考察同学对Handler消息处理的理解。
考生应该如何回答
Handler消息机制原理查看**《 Handler怎么进行线程通信,原理是什么?》**一题。
消息处理这块的代码是 Looper.loop()
,里面会执行 MessageQueeu.next()
方法,代码如下:
for (;;) {
Message msg = queue.next(); // might block
if (msg == null) {
// No message indicates that the message queue is quitting.
return;
}
MessageQueen.next代码如下:
Message next() {
for (;;) {
nativePollOnce(ptr, nextPollTimeoutMillis);
}
}
当没有消息时,或者消息不满足处理条件,则 nativePollOnce
方法会阻塞线程,直到有满足条件的消息到来。
handler.post(Runnable) runnable是如何执行的?(字节跳动、小米)
这道题想考察什么?
是否了解Handler的运行机制?
考察的知识点
Handler的内部原理
考生应该如何回答
主要分析runnable 是如何被封装成为一个message,以及它如何被添加到messageQueue里面的过程,最后再分析这个message如何运行的过程。
Runnable分发
首先我们看一下handler.post(Runnable)的相关源码
public final boolean post(@NonNull Runnable r) {
return sendMessageDelayed(getPostMessage(r), 0);
}
private static Message getPostMessage(Runnable r) {
Message m = Message.obtain();
m.callback = r;
return m;
}
public final boolean sendMessage(@NonNull Message msg) {
return sendMessageDelayed(msg, 0);
}
从上面代码我们可以看出,post(Runnable)
方法使用到的sendMessageDelayed函数,其实也就是调用了sendMessage(Message msg)
。只是它使用到了我们的getPostMessage
函数,将我们的Runnable转化为了我们的Message,由此可知handler.post(Runnable) 分发阶段实质上是和普通的Message是一样的。
Runnable执行
接着Message会通过queue.enqueueMessage(msg, uptimeMillis)
方法被添加到MessageQueen中,由Looper#loop
完成消息的分发执行。最终Looper#loop
中会将消息发送至Handler#dispatchMessage
处理:
/**
* Handle system messages here.
*/
public void dispatchMessage(@NonNull Message msg) {
if (msg.callback != null) {
handleCallback(msg);
} else {
if (mCallback != null) {
if (mCallback.handleMessage(msg)) {
return;
}
}
handleMessage(msg);
}
}
private static void handleCallback(Message message) {
message.callback.run();
}
在Handler#dispatchMessage
中Handler.dispatchMessage中如果判断需要分发执行的Message对象中callback(即post的Runnable)不为空,最终调用的是callback.run()方法,完成runnable的执行动作。
更多的Framework内核解析面试题完整文档的可扫描下方二维码免费领取!!!
目录
第一章 Java方面
- Java基础部分
- Java集合
- Java多线程
- Java虚拟机
第二章 Android方面
- Android四大组件相关
- Android异步任务和消息机制
- Android UI绘制相关
- Android性能调优相关
- Android中的IPC
- Android系统SDK相关
- 第三方框架分析
- 综合技术
- 数据结构方面
- 设计模式
- 计算机网络方面
- Kotlin方面
第三章 音视频开发高频面试题
- 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
- 怎么做到直播秒开优化?
- 直方图在图像处理里面最重要的作用是什么?
- 数字图像滤波有哪些方法?
- 图像可以提取的特征有哪些?
- 衡量图像重建好坏的标准有哪些?怎样计算?
第四章 Flutter高频面试题
- Dart部分
- Flutter部分
第五章 算法高频面试题
- 如何高效寻找素数
- 如何运用二分查找算法
- 如何高效解决雨水问题
- 如何去除有序数组的重复元素
- 如何高效进行模幂运算
- 如何寻找最长回文子串
第六章 Andrio Framework方面
- 系统启动流程面试题解析
- Binder面试题解析
- Handler面试题解析
- AMS面试题解析