Handler分析

Handler在Android中主要用于跨线程通信,实现UI更新。它包含Message、MessageQueue、Handler和Looper四个组件。Message携带信息,MessageQueue作为消息队列,Handler负责发送和处理消息,而Looper则不断从队列中取出Message进行分发。Handler的工作流程包括发送消息到队列和从队列取出消息进行处理。Looper和ThreadLocal确保了每个线程只有一个Looper。
摘要由CSDN通过智能技术生成

一,Handler的作用

Handler的作用是跨线程通信。Handler可以轻松地将一个任务切换到Handler所在的线程中去执行。常用于在子线程中进行耗时操作后,通过Handler切换到主线程中进行UI更新。

二,Handler的组成

Message(消息):需要被传递的消息,其中包含了消息ID,消息处理对象以及处理的数据等,由MessageQueue统一列队,最终由Handler处理。

MessageQueue(消息队列):用来存放Handler发送过来的消息,内部通过单链表的数据结构来维护消息列表,等待Looper的抽取。MessageQueue是一个优先级队列,MessageQueue里面的元素根据实际执行时间的先后排序。

Handler(处理者):负责Message的发送及处理。通过 Handler.sendMessage() 向消息池发送各种消息事件;通过 Handler.handleMessage() 处理相应的消息事件。

Looper(消息泵):通过Looper.loop()不断地从MessageQueue中抽取Message,按分发机制将消息分发给目标处理者。

三,Handler的工作原理
在这里插入图片描述
Handler的工作原理主要分为两部分
1,发送消息到消息队列。Handler把Message插入MessageQueue中。
2,从消息队列取出消息,并分发处理。Looper不断从MessageQueue取出Message并分派给相应的Handler进行处理。

四,Handler工作流程的源码分析
1,Handler如何把消息插入到消息列表
通过观察源码,我们发现,无论是Handler.sendXXX()方法还是Handler.post()方法,最后都会调用Handler.enqueueMessage()方法,里面又调用了MessageQueue.enqueueMessage()方法。
在这里插入图片描述
下面我们来看MessageQueue.enqueueMessage()方法的源码:

  boolean enqueueMessage(Message msg, long when) {
   
  
            //省略代码

            msg.markInUse();
            msg.when = when;
            Message p = mMessages;
            boolean needWake;
            
            //msg是想要插入的新消息
            //when是新消息的执行时间
            // mMessage 和 p 是原队列的头部节点
            
            if (p == null || when == 0 || when < p.when) {
   
                //如果满足以下条件之一,把新消息插到队列头部 
                //1,p == null 队列为空
                //2,when == 0 新消息要求立刻执行
                //3,when < p.when 新消息的执行时间早于队列头部节点的执行时间
                msg.next = p;
                mMessages = msg;
                needWake = mBlocked;
            } else {
   
                //否则插入到队列中间
                needWake = mBlocked && p.target == null && msg.isAsynchronous();
                Message prev;
                //遍历队列,寻找合适的插入位置
                for (;;){
   
                    prev = p;
                    p = p.next;
                    
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值