Android消息机制二

初学Android,不可避免会出现许多错误,如果因为文章中的错误而对您造成了困扰,万分抱歉,欢迎您在评论区指正。

上一篇博客介绍了 ThreadLocal,下面,我们就可以开始Handler的学习了。
先看一看 Handler 的用法:
在这里插入图片描述

说整套Handler消息机制,肯定不止会有Handler一个类在工作,具体是由 Handler、Looper、MessageQueue、Message 四个类配合工作。

Handler:

Handler的作用是投递消息和处理消息的,它会绑定一个Looper,一个线程可以有多个 Handler,但只会有一个Looper,为什么?我们就可以看一看Handler是如何被我们创建出来的,我们通常调用Handler()这个空参构造来创建,它会通过重载最终调用到这个构造器:
在这里插入图片描述

Handler 中的 Looper 通过 Looper.myLooper() 绑定,MessageQueue 是通过 mLooper 间接绑定的。Handler 还有一个主要的方法:handleMessage,它就是我们在线程中处理事务时自定义处理规则。有了处理事务的方法,那发送消息呢?当然是sendMessage(),走去瞅瞅:

我大致看了一下,也是通过方法重载最终调用sendMessageAtTime(),然后调用 enqueueMessage(),这个是 Handler 里的方法,在这个方法里面会调用 queue.enqueueMessage(),这时,就会跳转到 MessageQueue中的enqueueMessage() 方法了。

MessageQueue:

MessageQueue 负责维护消息队列,插入消息和取出消息(具体的实现)。

MessageQueue 是在哪里创建的,是在 Looper 中,待会我们细说。

我们先看 enqueueMessage() 方法:
在这里插入图片描述

这个就是 enqueueMessage() 方法中最核心的代码,很简单,从头到尾遍历这个单链表,将 msg.next 设置为 null,再将 msg 放到链表的最末尾,当然特殊设置了 when 的话,会找到合适的位置将其插入。所以,这个单链表是有顺序的,它是按照处理时间顺序从近到远排序的。

  • 这里简单介绍一下 when 这个字段,它是从系统开始的时间到调用这个方法的毫秒数 + delayMillis。

同时,它还会唤醒休眠的 Looper。

这就是将一个Message投放到队列的具体过程。我们下面分析取的过程。

取的动作是发生在 Looper 的 loop 中,它调用的是 MessageQueue 中的 next() 方法:
在这里插入图片描述
在这里插入图片描述

这个类中的逻辑很清晰,就是在 MessageQueue 中取出一个 Message 然后将他返回,我们看一看关键的地方:

  • ptr 这是一个native code,如果为 0 的话,就会return null;这时 Looper 就会退出,我们在研究 loop 时就会看到。

Looper:

Looper 负责不断的调用 MessageQueue 的 next() 方法取出消息并交给 Handler 处理。
在这里插入图片描述
Looper 的构造,绑定一个 MessageQueue,绑定当前线程。
在这里插入图片描述
Looper 通过它初始化,要创建一个 Looper,都要先 prepare 一下,然后调用 loop 就可以开启一个 Looper 了。其中使用到的 ThreadLocal 我们前面已经介绍过了。我们使用 Looper.myLooper() 就可以得到当前线程的 Looper 了。接下来看一看 Looper 中最重要的方法,就是我们 loop 之后发生了什么:
在这里插入图片描述
无限循环去拿消息,拿完消息就 dispatchMessage,dispatchMessage是 Handler 中的方法。这样,整套流程下来,就很自然完成了线程的切换。

在 dispatchMessage,完成了执行消息的过程:
在这里插入图片描述
首先处理 msg 的 callback,这个 callback 就是一个 Runnable,它是使用 handler.post() 递交的消息队列里的。其次处理 handler 的 callback,最后处理 msg,我们可以在 handlerMessage() 中实现自己的处理逻辑。

Handler到此我也就介绍完了,其中还有很多知识点我没有说到,如 ThreadLocal 的内存泄漏MessageQueue 的同步屏障,由于本人能力有限,无法清晰的讲解,有兴趣的同学可以自己搜一搜。

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值