最简洁的Handler介绍

作者: OpenDreamer | 来源:发表于2017-12-11 16:10 被阅读67次

    最简洁系列介绍:对于理科生来说有条理的知识结构更便于记忆和学习与理解,比起无比详细的文章和成段的代码,知识框架更容易分析问题和定位问题。这系列的文章现在还在尝试阶段,如果您有好的意见,欢迎交流!
    一、解决问题
    1、理解Handler原理;
    2、一个线程里面可以有多少个Looper,多少个消息队列,多少个Handler;
    3、消息队列的结构;
    4、消息队列没有消息的时候,Loope是什么状态;
    5、延时消息的是怎么实现的;
    6、当消息队列中没有Message时,线程是什么状态;
    二、原理
    1、整体逻辑:Handler通常用于线程之间通信,以子线程和主线程通信为例。 主线程默认会初始化一个Looper,Looper会不断的轮询它的消息队列。Handler中会有一个消息队列成员变量,它在那个线程中生成对象,就会将自己的消息队列指向相应线程Looper的消息队列,但他向自己的消息队列发送信时,相当于时向相应线程的消息队列发送消息;
    2、消息逻辑


    Handler原理.png

    三、问题解决
    1、一个线程中只有一个Looper,Looper的修饰是final ,生成Looper的构造方法是私有的,生成Looper通过调用Looper.prepare()方法,这个方法会先判断有无Looper,消息队列是在Looper中产生的,自然也就只有一个。Handler可以有多个,message成员变量target用于指向Handler,所以在发送的时候知道对应关系;
    2、消息队列的结构是一个链表结构。Message中有一个next成员变量会指向下一个Message;
    3、消息队列没有消息的时候会是阻塞状态,当有消息的时候会去唤醒;
    4、当前消息的时间如果还没有到,会不发送,并且设置唤醒一个时间;
    5、当消息队列没有消息时,线程会阻塞,没错是阻塞并且还是主线程,不要惊讶,为什么操作屏幕时不会卡顿,是因为屏幕的刷新也是通过Handler发送消息完成的,有消息来会重新唤醒线程。不要被阻塞吓住,如果不阻塞,主线程没事可干就结束了,主线程结束。。。。这你肯定没有遇到过吧!

    四、应用
    线程的之间的通信很多都适用Handler 例如异步任务,IntentService,HandlerThread,以后有机会会給大家出一系列最简单的介绍。

    相关文章

      网友评论

        本文标题:最简洁的Handler介绍

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