Handler 整理

非主线程创建Handler时,需要调用 Looper.prepare()。

Handler 整理_第1张图片

而主线程能够直接创建是因为 ActivityThread类的 main 函数里已经调用了 Looper.prepareMainLooper()。

Handler 整理_第2张图片

有了Handler对象之后,便可以发送消息。常用的调用方法有: handler.post() or handler.sendMessage()。而这些方法最终都调用私有方法 handler.enqueueMessage()。

Handler 整理_第3张图片

MessageQueue.enqueueMessage 字面意思指的是在消息队列里进行排队。

具体的实现也确实如此,enqueueMessage 方法部分截图:

Handler 整理_第4张图片

本以为底层会使用队列集合类的。然而并没有,而是通过 Message 类(单链表)的 next 属性进行排队操作。

至此,已将 Message 成功发送,并也已在待处理队列里。那么,怎么消费的呢?

在刚才Looper.prepare()之后,只是将Looper准备,还需启动:Looper.loop()。ActivityThread类的 main 函数里也确实调用了该方法。

Handler 整理_第5张图片

如字面意思,开始无限循环消息队列。

Handler 整理_第6张图片

当 Message 不为null,调用 msg.target.dispatchMessage() 。msg.target其实是 handler 对象。handler.dispatchMessage() 如下截图:

Handler 整理_第7张图片

至此。消息也就消费完了。

根据上述的整个流程。就可以实现异步请求的处理。

1,Ui线程创建 handler。

2,启动线程进行数据操作。

3,通过handler.post(), handler.sendMessage() 发送消息。

4,looper获取到消息后,再将消息分发给 handler。

5,Ui 线程创建的 handler 正常刷新 UI

Handler 整理_第8张图片

网上的一张流程图:

Handler 整理_第9张图片

你可能感兴趣的:(Handler 整理)