Handler在Android开发中经常使用,我们从经常使用的sendMessage 看一下Handler的源码:
实际是调用了sendMessageDelayed,只不过delayMillis=0了。
接着调用了 sendMessageAtTime函数
引出一个很重要的角色MessageQueue消息队列,enqueueMessage 消息入队列。
实际上是调用了MessageQueue.enqueueMessage()方法。
message入队列
核心代码就是这一块Looper了,一个for死循环,不断的取消息Message。
调用MessageQueue next方法出队列 nativePollOnce 如果没有消息了会利用pipe管道机制和epoll
、pipe机制,在没有消息时阻塞线程并进入休眠释放cpu资源,有消息时唤醒线程
Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce() 方法里,这也是为什么Looper是一个死循环但没有崩溃的原因。
还有dispatchMessage 进行分发给hander 的 handleMessage方法:
整个看下来就是一个生产者消费者模式,还有一个细节 post(Runable)的message是 Message.obtain()获取的,这个message可以复用,所以在使用的时候尽量也用这种方式,节约资源,算是个小技巧吧。