美文网首页
谈谈 android Handler机制--标准答案

谈谈 android Handler机制--标准答案

作者: 一方乌鸦 | 来源:发表于2021-01-19 10:36 被阅读0次

    最详细的讲解:
    https://www.jianshu.com/p/e172a2d58905
    https://www.jianshu.com/p/b4d745c7ff7a

    handler机制涉及到的类有Looper,Handler,MessageQueue和Message。
    一句话概括,Looper不断获取MessageQueue中的Message,交给Handler处理,同时Handler还向MessageQueue中投递Message。

    1.Handler
    首先Handler与线程Thread是一对多的关系,因为每个Thread只对应一个Looper,每个Looper只对应一个MessageQueue,每个MQ中有多个Message,每个Message最多指定一个Handler处理。Handler有两个作用,一是处理Message,二是将某个Message压入MQ中。
    实现第一个作用的方法是dispatchMessage和handleMessage. Looper从MQ中取出一个Message后,先调用Handler.dispatchMessage进行分发,流程是如果Message.callback不是空,执行该callback;如果Handler.callback不是空,执行该callback;如果前面的callback都不存在,调用Handler.handleMessage.
    实现第二个作用的方法是send系列方法和post系列方法. send系列需要的参数是一个Message,post需要的参数是Runnable,本质上是把Runnable设置为一个Message的callback,再压入MQ。

    2.MessageQueue
    MessageQueue是一个队列,有入队出队,新增和销毁等方法。

    3.Looper
    程序中的Looper有两种情况,主线程的Looper和普通线程的Looper。它的使用都有3个步骤:1.Looper.prepare;2.创建处理消息的Handler;3.Looper.loop() .
    prepare方法中会在当前线程的ThreadLocal中保存一份Looper。ThreadLocal是一种线程内的全局变量,不同线程中的ThreadLocal相互独立无法访问。Handler的构造方法会获取当前线程的Looper,同时保存Looper的MQ
    这样四个对象就串起来了

    其他知识点

    https://www.cnblogs.com/muouren/p/11706454.html
    https://blog.csdn.net/asdgbc/article/details/79148180

    Handler 同步屏障 和 异步消息

    • Handler中的Message可以分为两类:同步消息、异步消息,一般情况下这两种消息的处理方式没什么区别,只有在设置了同步屏障时才会出现差异。

    • 从代码层面上来讲,同步屏障就是一个Message,一个target字段为空的Message。
      设置了同步屏障之后,Handler只会处理异步消息。再换句话说,同步屏障为Handler消息机制增加了一种简单的优先级机制,异步消息的优先级要高于同步消息。

    • 如何使用异步消息?
      异步消息是不能使用的,因为相关设置都是hide。
      handler的相关构造函数,hide
      Mesasge.setAsynchronous(boolean),hide

    IdleHandler

    SyncBarrier(同步障碍器)与IdleHandler(闲时任务)机制都是通过 MQ 的 next() 方法提供的,
    执行IdleHandler其实就是调用其queueIdle()方法,queueIdle()如果返回false,next()方法会将该IdleHandler从mIdleHandlers中删除。这样的话,下一次next()方法再执行IdleHandler时就不会再重复执行它了。

    Looper.prepare() 做了什么事情

    new 一个 Looper,然后保存在 ThreadLocal 中,和当前线程绑定

    相关文章

      网友评论

          本文标题:谈谈 android Handler机制--标准答案

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