正文
Handler怎么进行线程通信,原理是什么?
这道题想考察什么?
这道题想考察同学对Handler的多线程通信原理是否清楚。
考生应该如何回答
Handler整体思想
在多线程的应用场景中,将工作线程中需更新UI
的操作信息 传递到 UI
主线程,从而实现 工作线程对UI
的更新处理,最终实现异步消息的处理。
Handler工作流程
Handler
机制的工作流程主要包括4个步骤:
- 异步通信准备
- 消息发送
- 消息循环
- 消息处理
具体如下图:
Handler工作流程图
如下图所示,handler的总体流程大致如下:
首先,系统通过调用 Looper.prepare()为线程准备Looper 和承接Message 的MessageQueue;
然后,系统再调用Looper.loop()函数,这个函数会开启一个死循环,在循环中不断的轮询MessageQueue消息队列,从消息队列中取出可以执行的Message消息,然后进行执行。
再然后,用户通过Handler.sendMessage这一类的函数调用,向MessageQueue里面不断的发送消息。
最后,由于Looper 中的loop是在不断轮询MessageQueue的,一旦发现MessageQueue里面有可执行的消息,那么就会将消息取出来,然后通过消息所携带的handler去执行。
总结
Handler 是一个消息管理机制,android 程序的运行必须依托于Handler机制,那么handler机制进行线程通信的原理思想如下: 1) 在启动handler通信机制的时候,首先会准备Looper,以及必须让Looper调用loop函数进入死循环;2)在Looper启动后,loop死循环就会不断的去轮询MessageQueue的next函数,试图通过这个方式获取到MessageQueue中存储的Message;3)当用户希望往当前创建handler的这个线程里面传递消息的时候,就可以调用这个handler的sendMessage或者postMessage 相关的函数,次数Message将被发送到对应的MessageQueue中;4)在第2)步中,loop里面的循环就会轮询到我们在第3)步中添加的消息,当这个消息被loop轮询到的时候,这个消息就会被处理掉,而且处理的线程就是当前轮询MessageQueue的线程。
总的来说,Handler机制可以理解为 在一个线程中创建了一个Message 对象(内存块),这个Message对象包含了我们要执行的动作;然后我们通过handler将这个Message内存块传给了MessageQueue,也就是说MessageQueue是存储的Message;然后Looper所在的线程通过loop()函数从MessageQueue中取到我们存储的Message,并在当前这个线程中去执行的过程。
文末
因为内容较多,更多的面试题详解可以扫描下方二维码免费领取!
![](https://hnxx.oss-cn-shanghai.aliyuncs.com/official/1680502264643.png?t=0.5231078833623948)