Android消息机制二
Posted <天各一方>
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 的同步屏障,由于本人能力有限,无法清晰的讲解,有兴趣的同学可以自己搜一搜。
以上是关于Android消息机制二的主要内容,如果未能解决你的问题,请参考以下文章
深入源码分析Handler 消息机制 LooperMessageQueue 消息同步屏障IdleHandlerMessage 复用