小结:
Handler类最为核心的函数是enqueueMessage和dispatcherMessage,前者把待处理的消息放入MessageQueue,而Looper调用后者来处理从MessageQueue获取的消息。 callback不为null(通过post系列函数添加到消息队列中)的message无法被拦截,而callback为null的函数可以被Handler的mCallback拦截
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++部分待后续研究: 相关的C++ Class: android.NativeMessageQueueandroid.Looperandroid.LooperCallbackandroid.SimpleLooperCallbackandroid.Messageandroid.MessageHandler