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零基础入门到精通,高手进阶之路

相关推荐
GSDjisidi1 天前
东京IT软件会社-(株)GSD|多种技术栈募集,高度人才+20分
开发语言·面试·职场和发展
xhxxx1 天前
不用 Set,只用两个布尔值:如何用标志位将矩阵置零的空间复杂度压到 O(1)
javascript·算法·面试
有意义1 天前
斐波那契数列:从递归到优化的完整指南
javascript·算法·面试
用户47949283569151 天前
面试官最爱挖的坑:用户 Token 到底该存哪?
前端·javascript·面试
Heo1 天前
Vue3.4中diff算法核心梳理
前端·javascript·面试
齐生11 天前
iOS 知识点 - ARC / 引用计数 / SideTable / weak 表
笔记·面试
用户47949283569151 天前
XSS、CSRF、CSP、HttpOnly 全扫盲:前端安全不只是后端的事
前端·后端·面试
镜花水月linyi1 天前
Java 线程创建的完整链路:从 Java 层 → JVM 层 → 操作系统层
java·后端·面试
CC码码1 天前
前端字符串排序搜索可以更加细化了
前端·javascript·面试
Crystal3281 天前
冒泡排序 bubble sort
前端·javascript·面试