[聚合文章] Android消息机制(Handler)——深入源码解析

消息系统 1900-01-01 16 阅读

2.概念

本节都是基础,我化身十万个为什么提出以下几个问题!如果读者都明了那就直接跳向下一节!

  • Android的消息机制是什么?
    Android的消息机制主要是指Handler的运行机制,主要作用是将当前线程任务切换到指定线程中去执行。

  • 为什么会有消息机制?
    因为Android在内部规定访问UI必须在主线程中去执行,如果在子线程中执行UI会抛出异常。有的同学会说:“那我们全部在主线程中操作不就好啦?”。这样也是不行的,如若该UI有访问网络等耗时操作在主线程中,会阻塞程序,并且导致ANR异常。这样我们只能在子线程中执行耗时操作,在主线程中更新UI,所以这就是Android提供消息机制的原因。
    总结一下,主要有两个原因:

    • 子线程访问UI会抛出异常
    • 主线程中执行耗时操作会发生ANR异常
  • 消息机制的原理是什么?
    说到原理,就不得不说3+1兄弟!
    Handler、MessageQueue、Looper + ThreadLocal
    3+1兄弟是消息机制的核心,只要掌握了这几兄弟,掌握消息机制就不在话下了!

    • Handler:它的工作主要包含消息的发送和接收过程。
    • MessageQueue:它是消息队列,是用来存储消息Handler发来的消息。它的内部并不是真正的队列,而是采用单链表来存储消息。
    • Looper:MessageQueue只能存储消息,但并不能发送消息,这点就由Looper来解决。Looper内部是一个无限循环,从MessageQueue查找是否有新消息,如果有就将消息传递给目标线程的Handler,如果没有就一直等待。
    • ThreadLocal:为啥把ThreadLocal说成+1兄弟呢?因为这小伙子起到一个辅助作用。Handler创建的时候都会使用当前线程的Looper来构建循环系统,那么怎么样在Handler内部找到这个线程的Looper呢?那就用到了ThreadLocal,ThreadLocal可以在不同线程中互不干扰的存储并提供数据,那找到不同线程Looper就很简单啦。
  • 消息机制的流程?
    说完了3+1兄弟,是时候把他们合起来了。以访问网络获取数据并展示到TextView为例:

    • 创建Handler:在Activity的主线程中创建Handler,主线程自带Looper,所以不需要创建。
    • 发送消息到MessageQueue:创建子线程获取登录信息,成功后,使用Handler的send或者post方法发送结果到MessageQueue的enqueueMessage方法将这个消息放入消息队列中。
    • Looper处理消息:此时Looper发现了这个消息,然后将它转发给目标Handler。此时已经到了主线程中,将数据摆放在TextView上。

消息机制的原理到这已经差不多有了头绪。具体的深入分析咱们下一章跟着源码一起来!

3.原理分析

上一节对Android的消息机制做了一个概括的描述,本节会对Android消息机制的源码和实现原理做一个全面的分析,主要包括Handler、MessageQueue、Looper和ThreadLocal。通过本节的学习,同学们会对消息机制有一个深入的理解。


注:本文内容来自互联网,旨在为开发者提供分享、交流的平台。如有涉及文章版权等事宜,请你联系站长进行处理。