非主线程创建Handler时,需要调用 Looper.prepare()。
![](https://img.haomeiwen.com/i4424609/89b59d278face605.png)
而主线程能够直接创建是因为 ActivityThread类的 main 函数里已经调用了 Looper.prepareMainLooper()。
![](https://img.haomeiwen.com/i4424609/764aefaf5050b22f.png)
有了Handler对象之后,便可以发送消息。常用的调用方法有: handler.post() or handler.sendMessage()。而这些方法最终都调用私有方法 handler.enqueueMessage()。
![](https://img.haomeiwen.com/i4424609/e5f6c91753958b82.png)
MessageQueue.enqueueMessage 字面意思指的是在消息队列里进行排队。
具体的实现也确实如此,enqueueMessage 方法部分截图:
![](https://img.haomeiwen.com/i4424609/057b7494f3d9aa8b.png)
本以为底层会使用队列集合类的。然而并没有,而是通过 Message 类(单链表)的 next 属性进行排队操作。
至此,已将 Message 成功发送,并也已在待处理队列里。那么,怎么消费的呢?
在刚才Looper.prepare()之后,只是将Looper准备,还需启动:Looper.loop()。ActivityThread类的 main 函数里也确实调用了该方法。
![](https://img.haomeiwen.com/i4424609/51d51af65b4e6654.png)
如字面意思,开始无限循环消息队列。
![](https://img.haomeiwen.com/i4424609/e11588d121149468.png)
当 Message 不为null,调用 msg.target.dispatchMessage() 。msg.target其实是 handler 对象。handler.dispatchMessage() 如下截图:
![](https://img.haomeiwen.com/i4424609/c0a54ca03a9180e3.png)
至此。消息也就消费完了。
根据上述的整个流程。就可以实现异步请求的处理。
1,Ui线程创建 handler。
2,启动线程进行数据操作。
3,通过handler.post(), handler.sendMessage() 发送消息。
4,looper获取到消息后,再将消息分发给 handler。
5,Ui 线程创建的 handler 正常刷新 UI
![](https://img.haomeiwen.com/i4424609/4cfdb52b2f4ddfb3.png)
网上的一张流程图:
![](https://img.haomeiwen.com/i4424609/5ccdddf07516bd45.png)
网友评论