这是我的理解,面试官说我没讲清楚,自己也觉得模糊: “当然是借助 ThreadLocal 啦。 通过 ThreadLocal 可以获得主线程的 Looper 和 MessageQueue。 主线程的 Looper 一直在主线程里面无限循环。”
特来问问
1
blackboom 2019-09-12 17:10:53 +08:00
码上开学,有一节讲的不错
https://www.bilibili.com/video/av49582369 |
2
merpyzf 2019-09-12 17:36:01 +08:00 1
因为 Handler 的 dispatchMessage 方法是在创建 Handler 的线程中的 Looper 内部调用的,因此 Looper 所处的线程也就决定了你 Handler 提交任务执行所在的线程。
|
3
Vdream 2019-09-12 17:43:15 +08:00
sendMessage 其实是把自己也传过去了 handler 回调就知道是谁了
|
4
bccoder 2019-09-12 20:50:10 +08:00 1
handler 所属线程的 Looper 会将 msg 从 msgqueue 中取出然后执行相关逻辑。
|
5
mxalbert1996 2019-09-12 23:06:01 +08:00 via Android
楼主是不是对 ThreadLocal 有什么误解? ThreadLocal 就是用来存线程内变量的,通过 ThreadLocal 获取别的线程的变量是什么鬼。。。
|
6
eminemcola 2019-09-18 13:32:01 +08:00
楼主的问题核心在于线程的「切换」。而我认为 handler 本身并不负责线程的「切换」,它是只负责了消息的收发。
|
7
ysy950803 2020-11-12 19:11:33 +08:00
上面的附言说得对,而且网上一堆长篇大论的都没说到要点,一会儿扯什么 ThreadLocal 一会儿又是 IPC 。
在 B 线程调用 A 线程的 Handler 来发消息,这特么当然就跨线程了啊,就这么简单。服务端开发里面的消息队列本身也是这个原理,队列对所有线程都是可见的,大家都可以往里面 enqueue 消息。 |