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 的工作原理:
网友评论