首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
nnegier
V2EX  ›  Android

Handler 是怎么完成线程切换的?

  •  
  •   nnegier · 132 天前 · 2504 次点击
    这是一个创建于 132 天前的主题,其中的信息可能已经有所发展或是发生改变。

    这是我的理解,面试官说我没讲清楚,自己也觉得模糊: “当然是借助 ThreadLocal 啦。 通过 ThreadLocal 可以获得主线程的 Looper 和 MessageQueue。 主线程的 Looper 一直在主线程里面无限循环。”

    特来问问

    第 1 条附言  ·  11 天前
    问题本身是错误的。没有什么所谓的线程的切换。Looper 将一个线程变成异步处理线程,就是线程内部有一个 while(true),有消息就调用回掉函数,没有就 wait。Handler 只是一个用于收发消息的作用。
    6 回复  |  直到 2019-09-18 13:32:01 +08:00
    blackboom
        1
    blackboom   132 天前
    码上开学,有一节讲的不错
    https://www.bilibili.com/video/av49582369
    merpyzf
        2
    merpyzf   132 天前   ♥ 1
    因为 Handler 的 dispatchMessage 方法是在创建 Handler 的线程中的 Looper 内部调用的,因此 Looper 所处的线程也就决定了你 Handler 提交任务执行所在的线程。
    Vdream
        3
    Vdream   132 天前
    sendMessage 其实是把自己也传过去了 handler 回调就知道是谁了
    bccoder
        4
    bccoder   132 天前   ♥ 1
    handler 所属线程的 Looper 会将 msg 从 msgqueue 中取出然后执行相关逻辑。
    mxalbert1996
        5
    mxalbert1996   132 天前 via Android
    楼主是不是对 ThreadLocal 有什么误解? ThreadLocal 就是用来存线程内变量的,通过 ThreadLocal 获取别的线程的变量是什么鬼。。。
    eminemcola
        6
    eminemcola   126 天前
    楼主的问题核心在于线程的「切换」。而我认为 handler 本身并不负责线程的「切换」,它是只负责了消息的收发。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   820 人在线   最高记录 5168   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 38ms · UTC 22:36 · PVG 06:36 · LAX 14:36 · JFK 17:36
    ♥ Do have faith in what you're doing.