Android消息机制不完全解析(上)(native层待研究)
http://www.07net01.com/program/571329.html
Message类:
主要提供了一些成员,用以保存消息数据
when : 消息处理时间
next : 形成链表
值得一提的是,Android提供了一个简单,但是有用的消息池,对于Message这种使用频繁的类型,可以有效的减少内存申请和释放的次 数,提高性能。
小结:
- Message的核心在于它的数据域,Handler根据这些内容来识别和处理消息
- 应该使用Message.obtain(或者Handler.obtainMessage)函数获取message实例
Handler
Handler的构造函数最主要的就是初始化成员变量:mLooper和mQueue。
Handler.post系列和send系列函数最终都会调用enqueueMessage函数,把message入列,不同之处在于post系列函数会以Runable参 数构建一个Message实例。
Handler.dispatchMessage:
小结:
- Handler类最为核心的函数是enqueueMessage和dispatcherMessage,前者把待处理的消息放入MessageQueue,而Looper调用后者来处理从MessageQueue获取的消息。
- callback不为null(通过post系列函数添加到消息队列中)的message无法被拦截,而callback为null的函数可以被Handler的mCallback拦截
Looper
private Looper(boolean quitAllowed) {
mQueue = new MessageQueue(quitAllowed);
mThread = Thread.currentThread();
}
- 在prepare的时候,创建一个Looper,同时在Looper的构造方法中创建一个消息队列MessageQueue,同时将Looper保存到ThreadLocal中
(这个是关于ThreadLocal的,不太懂,以后研究了再说)
- 调用loop进入消息循环,此处其实就是不断到MessageQueue中取消息
Message
,进行处理
MessageQueue: 重点
enqueueMessage函数: 将Message插入到有序的消息队列中
next()方法: 获取下一个消息,会阻塞
重点:
MessageQueue.next
原理(这也是Handler发送的延迟消息能比较准时执行的原因)
nativePollOnce(mPtr, nextPollTimeoutMillis) 阻塞等待nextPollTimeoutMillis毫秒的时间返回,与Object.wait(long timeout)相似
小结:
- MessageQueue作为一个容器,保存了所有待执行的消息。
- MessageQueue中的Message包含三种类型:普通的同步消息,Sync barrier(target = null),异步消息(isAsynchronous() = true)。
- MessageQueue的核心函数为enqueueMessage和next,前者用于向容器内添加Message,而Looper通过后者从MessageQueue中获取消息,并实现无消息情况下的等待。
- MessageQueue把Android消息机制的Java实现和C++实现联系起来。
相关的C++ Class:
- android.NativeMessageQueue
- android.Looper
- android.LooperCallback
- android.SimpleLooperCallback
- android.Message
- android.MessageHandler