重学Handler

##引用1:Handler的运行机制

##引用2:Handler实现线程间通信

##引用3:关于Handler的几个问题

##Handle面试问法

##Handle10问

消息发送和接收处理

发送消息:

表象:handler.sendMessasge

本质:最终会调用enqueueMessage方法将消息放到MessageQueue中

处理消息:

表象:handler的handleMessage

本质:Looper通过不断的loop从MessageQueue取出数据,然后通过callback返回给调用方

handler线程通信:

(1)子线程向主线程发送消息:
主线程中创建Handler,然后在子线程里调用主线程的Handler来sendMessage

(2)主线程向子线程中发送消息:
子线程run方法中流程:Looper.prepare()-> 创建子线程的内部的Handler -> Looper.loop(),然后主线程中通过持有子线程的Handler来sendMessage

(3)子线程间发送消息:
A子线程持有B子线程的Handler,然后在A子线程中通过Handler来sendMessage

以上也可以通过持有其他线程的Looper,来创建Handler,进而sendMessage

如何实现线程之间切换

当在A线程中创建handler的时候,同时创建了MessageQueue与Looper,Looper在A线程中调用loop进入一个无限的for循环从MessageQueue中取消息,当B线程调用handler发送一个message的时候,会通过msg.target.dispatchMessage(msg);将message插入到handler对应的MessageQueue中,Looper发现有message插入到MessageQueue中,便取出message执行相应的逻辑,因为Looper.loop()是在A线程中启动的,所以则回到了A线程,达到了从B线程切换到A线程的目的。

总结

(1)handler和looper是唯一映射的关系

(2)一个handler只能拥有一个looper

(3)一个looper只能和一个线程相照应,同时一个looper也对应唯一的一个MessageQueue

(4)一个looper却可以拥有多个handler(因为handler可以通过指定looper来创建)

Author

jiangyao

Posted on

2021-06-12

Updated on

2022-10-17

Licensed under