美文网首页Android 进阶
Android 消息机制

Android 消息机制

作者: VelyVelyGood | 来源:发表于2017-07-26 18:47 被阅读1次

Android的消息机制概述:

1、消息机制的简介

主要是指Handler的运行机制,以及Handler所附带的 MessageQueue 和 Lopper 的工作过程。

Handler 的主要作用是将一个任务切换到某个指定的线程中去执行(一般就是 Handler 所在的线程)。

   思考 1、android 为何要提供这种机制?

因为 android 不支持在子线程中操作 UI ,但是耗时操作又不建议在 UI 线程中执行只好放在子线程中执行,执行完后又需要将信息更新到 UI 上,所以提供 Handler 方便解决子线程无法访问 UI 的矛盾

   思考 2、android 为何不允许在子线程中访问 UI 呢?

因为 android 的 UI 控件不是线程安全的,多线程并发访问可能会导致 UI 控件处于不可预期状态;

如果对 UI 控件加锁机制的话又会导致两个缺点:

       缺点 1、加上锁机制会让 UI 的访问逻辑变得复杂;

       缺点 2、 锁机制会阻塞某些线程的执行,降低 UI 的访问效率;

所以 android 才会采用单线程模型来处理 UI 操作;

2、消息机制的组件模型

Message:需要传递的消息体,可以传递数据;

MessageQueue:

消息队列,但是它的内部实现并不是用的队列,实际上是通过一个单链表的数据结构来维护消息列表,因为单链表在插入和删除上比较有优势。主要包含两个操作

插入:enQueueMessage() 往消息队列中插入一条消息

读取:next(),读取伴随着删除;从消息队列中读取一条消息并从消息队列中移除;

next 方法是一个无限循环的方法,如果消息队列中没有消息,那么 next 方法会一直阻塞在这里。当有新消息到来时,next 方法会返回这条消息并将其从单链表中移除。

Looper :不断循环执行(Looper.loop),从MessageQueue中读取消息,按分发机制将消息分发给目标处理者。

Handler :消息辅助类,主要工作是发送消息(Handler.sendMessage)和接收消息(Handler.handleMessage)主要作用是将一个任务切换到某个指定的线程中去执行(一般就是 Handler 所在的线程)。

ThreadLocal:

ThreadLocal 是一个线程内部的数据存储类,通过它可以在指定的线程中存储数据,数据存储以后,只有在指定的线程中才可以获取到存储的数据。

原理是因为 Thread 类内部有一个成员 ThreadLocal.Values localValues 专门用于存储线程的 ThreadLocal 的数据;而 ThreadLocal 的 set get 方法都是根据当前线程Thread.currentThread(),获取对应线程的 localValues 对象的 table 数组,进而通过 table 数组操作数据。所以每个线程操作的都是自己线程内的 localValues 的 table 数组。

3、消息机制的架构

3.1 消息机制的运行流程

在子线程执行完耗时操作,当 Handler 发送消息时,将会调用 MessageQueue.enqueueMessage,向消息队列中添加消息。当通过Looper.loop 开启循环后,会不断地从消息队列中读取消息,即调用 MessageQueue.next,然后调用 Message 的目标 target(即发送该消息的Handler)的 dispatchMessage 方法传递消息,然后返回到 Handler 所在线程,目标 Handler 收到消息,调用 handleMessage 方法,接收消息,处理消息。

3.2 MessageQueue,Handler和Looper三者之间的关系:

   Handler 的工作需要 Looper,在创建 Handler 的时候其构造函数会对当前线程是否有 Looper 做检测,没有的话会报错。

   每个线程只能存在一个Looper,Looper保存在线程 Thread 的 ThreadLocal 中。为一个线程创建 Looper 需要调用 Looper.prepare() 方法,接着再调用 Looper.loop() 方法来开启消息循环。

       Looper.prepare() 方法 会初始化一个 MessageQueue。

       Looper.loop() 方法是一个死循环,不停的调用 MessageQueue.next() 方法,MessageQueue.next() 是一个阻塞方法,当消息队列中没有有消息时会一直阻塞在那里,当消息队列有消息时 MessageQueue.next() 返回消息 msg 在 loop() 方法中处理。处理方式是 调用 msg.target.dispatchMessage(msg), msg.target 就是 Handler (Handler sendMsg 最终调用的enqueueMessage中设置的),也就是最终由 Handler 来处理这个 Msg。

4、消息机制各个组件的工作原理

4.1 MessageQueue 的工作原理:

相关文章

网友评论

    本文标题:Android 消息机制

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