我们知道,android是不允许在子线程中更新ui的,但是为了避免anr,我们有时候不得不在子线程中去执行一些耗时操作,然后根据这些耗时操作的执行结果来更新ui界面。对于这种情况,android提供了一套异步消息处理机制。
异步消息处理机制
四部分
Message | 又称消息,在不同线程之间交换数据 |
Handler | 发送(sendMessage方法)和处理(handlerMessage方法)消息 |
MessageQueue | 又称消息队列,存放所有通过handler发送的消息 |
Looper | 每个线程中MessageQueue的管家,在调用Looper的loop方法后,会进入一个无限循环,当这个循环发现MessageQueue中存在Message时,就会将其取出并传入Handler的handleMessage方法中进行处理 |
处理流程
- 创建handler对象,重写handlerMessage方法;
- 当子线程需要进行ui操作时,创建一个message对象,通过handler的sendMessage方法发送出去;
- 被发送的message进入消息队列,等待looper处理;
- looper会不断尝试获取消息队列中的内容,获取后会将消息发送回handler的handleMessage方法中处理
一个message经过上述流程后,就从子线程进入了主线程,从不能更新ui变成了可以。
为什么说handler是在主线程运行的?
当我们创建handler对象时,需要改写handlerMessage方法,而此方法就是在主线程中运行的。这就是为什么我们可以在这个方法中,放心地执行ui操作