美文网首页
Handler 整理

Handler 整理

作者: 进击的杰爷 | 来源:发表于2018-02-08 11:54 被阅读0次

    非主线程创建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

    网上的一张流程图:

    相关文章

      网友评论

          本文标题:Handler 整理

          本文链接:https://www.haomeiwen.com/subject/hqozzxtx.html