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

相关推荐
天天扭码2 小时前
总所周知,JavaScript中有很多函数定义方式,如何“因地制宜”?(ˉ﹃ˉ)
前端·javascript·面试
天天扭码3 小时前
深入讲解Javascript中的常用数组操作函数
前端·javascript·面试
渭雨轻尘_学习计算机ing3 小时前
二叉树的最大宽度计算
算法·面试
mazhimazhi3 小时前
GC垃圾收集时,居然还有用户线程在奔跑
后端·面试
Java技术小馆4 小时前
SpringBoot中暗藏的设计模式
java·面试·架构
Aniugel4 小时前
JavaScript高级面试题
javascript·设计模式·面试
lqstyle4 小时前
Redis的Set:你以为我是青铜?其实我是百变星君!
后端·面试
_一条咸鱼_4 小时前
揭秘 Android ListView:从源码深度剖析其使用原理
android·面试·android jetpack
_一条咸鱼_4 小时前
深入剖析 Android NestedScrollView 使用原理
android·面试·android jetpack
_一条咸鱼_4 小时前
揭秘 Android ScrollView:深入剖析其使用原理与源码奥秘
android·面试·android jetpack