美文网首页Android面试题
【知识】Handler相关

【知识】Handler相关

作者: FynnJason | 来源:发表于2019-12-30 10:12 被阅读0次

    原创不易,尊重作者,转载请注明出处

    目录

    • Handler原理
    • 子线程一定不能更新UI吗
    • Handler内存泄露
    • 一个线程是否可以创建多个Handler
    • Handler与Looper的关系

    Handler原理

    handler原理主要可以通过5个类和3个步骤来讲清楚。

    5个类

    Message:消息,包含了消息ID、消息处理对象以及处理的数据。

    Handler:处理者,负责Message的发送和处理,在使用Handler时,需要实现handleMessage方法来对特点的Message进行处理。

    MessageQueue:消息队列,用来存放Handler发送过来的消息,遵循先进先出的原则,将Message以链表的方式串联起来,等待Looper抽取。

    Looper:消息泵,不断从MessageQueue中抽取Message执行。

    Thread:线程,负责调度整个消息循环。

    3个步骤

    Handler创建消息:Handler创建消息时首先查询消息池中是否有消息存在,如果有消息存在,直接从消息池中取出,如果没有消息存在,则会重新初始化一个消息实例。

    Handler发送消息:Handler通过sendMessage发送消息时,UI主线程会判断是否创建过Looper,如果没有创建过Looper,会通过ThreadLocal创建一个Looper,如果创建过Looper,则直接使用ThreadLocal之前创建的Looper,当Looper创建的时候会创建一个消息队列MessageQueue,消息队列会存放Handler发送的消息。

    Handler处理消息:UI主线程会通过Looper循环查询消息队列MessageQueue,当发现有消息存在时会将消息取出,然后分析消息的参数,判断该消息对应的Handler,然后将消息分发到指定的Handler进行处理。

    结论

    通过以上5个类和3个步骤,基本可以理解Handler的原理。

    子线程一定不能更新UI吗

    不是。大多数情况下,子线程是不能更新UI的,但是以下两种情况,子线程可以更新UI。

    支持在子线程更新UI的控件

    在Android中,有支持在子线程中更新UI的控件,例如:SurfaceView。

    在特定的生命周期可以实现子线程更新UI

    在Activity的onResume生命周期之前,是可以在子线程中更新UI的。

    Handler内存泄露

    请参考我的另一篇文章:
    内存泄露

    一个线程是否可以创建多个Handler

    可以。

    Handler与Looper的关系

    Handler与Looper的关系可以理解成Handler、MessageQueue、Looper的关系,在一个线程中,结构是一个Looper、一个MessageQueue和多个Handler。

    相关文章

      网友评论

        本文标题:【知识】Handler相关

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