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