美文网首页
Android 消息机制

Android 消息机制

作者: biginsect | 来源:发表于2018-09-07 15:53 被阅读5次

    概述

    Android 消息机制主要是指 Handler 的运行机制及其附带的 MessageQueue 和 Looper 的工作过程。

    涉及到的角色:

    1. MessageQueue. 负责存储消息列表,采用的是单链表的数据结构。主要有两个操作:插入和读取—— enqueueMessage() & next(),next() 方法的读取伴随着删除操作。

    2. Looper. 轮询检查是否有新的消息(Message),运行在创建 Handler 的线程中。在 Looper 的构造方法里面会创建一个 MessageQueue,并保存当前线程对象。调用主线程的 Looper :Looper.prepareMainLooper(),一般线程则是 Looper : Looper.prepare()——创建 Looper 的同时 ThreadLocal 会保存当前 Looper (以当前线程对象为 key )。
      Looper 提供了 quit() 和 quitSafely() 两个方法退出 Looper 。1)quit() 直接退出;2)quitSafely() 是先做标记,将对应的 MessageQueue 的 Message 处理完毕后退出。对于子线程,若为其创建了 Looper,这个子线程就会进入等待消息的状态,因此 Looper 的手动退出是有必要的。
      Looper.loop() 调用了 MessageQueue 的 next() 方法,是一个阻塞操作,没有消息时会阻塞。

    3. ThreadLocal. 在每个线程中存储数据,以当前线程作为 key。适合的场景:1)以线程作为作用域并且不同的线程拥有不同副本的数据。2)复杂逻辑下的对象传递。

    4. Handler. 将任务切换到某个指定的线程中去执行。主要工作是发送消息和接收消息。1)发送消息有两个方法 post() & sendMessage(),而 post() 最终会调用 sendMessage(),而 sendMessage() 最终会调用enqueueMessage() 插入消息,从而 MessageQueue 的next() 会返回消息给 Looper ,Looper 会将消息交与 Handler 处理。2)Handler 会调用 dispatchMessage(),最终是调用 handleMessage() 方法处理消息。
      在 dispatchMessage() 中,先检查 Message 的 callback 是否为 null,不为 null 就通过 handleCallback() 处理消息。Message 的 callback 实际上是 Runnable 对象,最后会运行对应的 run()。
      而 Message 的 callback 为 null 时,检查 mCallback 是否为 null,不为 null 则调用其 handleMessage() 处理消息。mCallback 是 Callback 类型,是一个接口,它可以用来创建 Handler 的实例而不用派生子类(实际工作中大多是通过派生 Handler 的子类并重写 handleMessage() 的方式来创建 Hanlder)。具体的创建方式是 Handler handler = new Handler(callback)。最后是调用 Handler 的 handleMessage() 方法来处理消息。
      在创建 Handler 的时候,会检查 Looper.myLooper() 是否为 null,为 null 时会报 RuntimeException。因此不能在没有 Looper 的线程中创建 Handler。

    主线程(ActivityThread)的消息循环

    入口是main(),此方法中通过Looper.prepareMainLooper() 创建主线程的 Looper 以及对应的 MessageQueue,并通过 Looper.loop() 开启消息循环。

    ActivityThread 有一个内部类 H extends Handler,其定义了一组消息类型,包含四大组件的启动与停止。

    ActivityThread 通过 ApplicationThread 和 AMS 进行 IPC(进程间通信),AMS 完成 ActivityThread 的请求后回调 ApplicationThread 的 Binder 接口的方法,之后 ApplicationThread 会发消息给 H,H 收到消息之后将 ApplicationThread 中的逻辑切换到 ActivityThread 中去执行。

    相关文章

      网友评论

          本文标题:Android 消息机制

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