经过了不少时间的学习和了解,算是熟悉了Android的消息队列模型,在此总结一下。
为什么需要消息队列模型
- Android规定访问UI只能在主线程中进行。 子线程中访问就会抛出异常
- ViewRootImpl(最上层的绘制View,Window相关的类) 中,有checkThread()方法判断当前现场是不是主线程,如果是子线程访问UI则抛出异常
- 为什么不允许子线程中访问UI?
- Android的UI控件是不安全的
- 没有加锁,因为会影响效率
- 多线程访问会出现数据竞争问题
消息队列于是出现用于在不同线程之间安全的处理UI且不会影响响应速度
基本概念
Looper:
- 一个类
- 官方定义:Class used to run a message loop for a thread. Threads by default do not have a message loop associated with them
相关方法:
- Looper.prepare() :准备工作
- Looper.loop() :开始运作
- Looper.myQueue() :获取与之相关的消息队列
MessageQueue
- 一个队列 底层是单链表实现的
- 存放Object or Runnable
相关方法:
- final boolean enqueueMessage(Message msg, long when);
- fi