Framework内核解析面试题汇总(九)

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内核解析面试题完整文档的可扫描下方二维码免费领取!!!

目录

img

第一章 Java方面

  • Java基础部分
  • Java集合
  • Java多线程
  • Java虚拟机

img

第二章 Android方面

  • Android四大组件相关
  • Android异步任务和消息机制
  • Android UI绘制相关
  • Android性能调优相关
  • Android中的IPC
  • Android系统SDK相关
  • 第三方框架分析
  • 综合技术
  • 数据结构方面
  • 设计模式
  • 计算机网络方面
  • Kotlin方面

img

第三章 音视频开发高频面试题

  • 为什么巨大的原始视频可以编码成很小的视频呢?这其中的技术是什么呢?
  • 怎么做到直播秒开优化?
  • 直方图在图像处理里面最重要的作用是什么?
  • 数字图像滤波有哪些方法?
  • 图像可以提取的特征有哪些?
  • 衡量图像重建好坏的标准有哪些?怎样计算?

img

第四章 Flutter高频面试题

  • Dart部分
  • Flutter部分

img

第五章 算法高频面试题

  • 如何高效寻找素数
  • 如何运用二分查找算法
  • 如何高效解决雨水问题
  • 如何去除有序数组的重复元素
  • 如何高效进行模幂运算
  • 如何寻找最长回文子串

img

第六章 Andrio Framework方面

  • 系统启动流程面试题解析
  • Binder面试题解析
  • Handler面试题解析
  • AMS面试题解析

img

猜你喜欢

转载自blog.csdn.net/Misdirection_XG/article/details/134502978