handler.post(Runnable) runnable是如何执行的?(字节跳动、小米)

前言

看一遍不如写一边,每个人都有自己的理解

主要分析runnable 是如何被封装成为一个message,以 它如何被添加到messageQueue里面的过程,最后再分析这个message如何运行的过程。

Runnable分发

首先我们看一下handler.post(Runnable)的相关源码

less 复制代码
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处理:

scss 复制代码
/**
 * 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的执行动作。

今日分享到此结束,对你有帮助的话,点个赞再走呗,每日一个面试小技巧
关注公众号:Android老皮

解锁 《Android十大板块文档》 ,让学习更贴近未来实战。已形成PDF版

内容如下

1.Android车载应用开发系统学习指南(附项目实战)
2.Android Framework学习指南,助力成为系统级开发高手
3.2023最新Android中高级面试题汇总+解析,告别零offer
4.企业级Android音视频开发学习路线+项目实战(附源码)
5.Android Jetpack从入门到精通,构建高质量UI界面
6.Flutter技术解析与实战,跨平台首要之选
7.Kotlin从入门到实战,全方面提升架构基础
8.高级Android插件化与组件化(含实战教程和源码)
9.Android 性能优化实战+360°全方面性能调优
10.Android零基础入门到精通,高手进阶之路

相关推荐
用户938515635079 小时前
TypeScript 高级类型 + CSS 三列布局:从类型体操到样式工程的进阶之路
css·面试·typescript
Scabbards_11 小时前
面试Leetcode - Heap 堆
java·leetcode·面试
黄敬峰11 小时前
🐳 Docker 从入门到实战:一次搞定容器化 + Nginx 反向代理
面试
程序员清风12 小时前
专业再升级!程序员专属显示器明基RD280UG上手实测!
java·后端·面试
six_13 小时前
C# 上位机(持续更新中)
前端·面试·c#
码匠许师傅14 小时前
【C++ 面试真题】聊聊 C++ 的序列容器
java·c++·面试
东华万里15 小时前
第40篇C++核心基础与工程实践:从底层逻辑到避坑指南
开发语言·c++·面试·大学生专区
wangjialelele18 小时前
动态规划DP经典题型总结(Java、C++):路径、子数组、子序列、背包问题详解
java·c++·算法·面试·动态规划·代理模式
一只叫煤球的猫19 小时前
Spring AI 2.0 源码解析(一):一次 ChatClient 调用到底经历了什么?
后端·面试·ai编程
子林super19 小时前
使用dockerfile打包ng镜像演示
面试