Handler源码详解

Handler在Android开发中经常使用,我们从经常使用的sendMessage 看一下Handler的源码:
实际是调用了sendMessageDelayed,只不过delayMillis=0了。
Handler源码详解_第1张图片
接着调用了 sendMessageAtTime函数
Handler源码详解_第2张图片
引出一个很重要的角色MessageQueue消息队列,enqueueMessage 消息入队列。
Handler源码详解_第3张图片
实际上是调用了MessageQueue.enqueueMessage()方法。
Handler源码详解_第4张图片
message入队列
Handler源码详解_第5张图片
核心代码就是这一块Looper了,一个for死循环,不断的取消息Message。
Handler源码详解_第6张图片
调用MessageQueue next方法出队列 nativePollOnce 如果没有消息了会利用pipe管道机制和epoll
、pipe机制,在没有消息时阻塞线程并进入休眠释放cpu资源,有消息时唤醒线程
Linux pipe/epoll机制,简单说就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce() 方法里,这也是为什么Looper是一个死循环但没有崩溃的原因。
Handler源码详解_第7张图片
还有dispatchMessage 进行分发给hander 的 handleMessage方法:Handler源码详解_第8张图片
Handler源码详解_第9张图片

整个看下来就是一个生产者消费者模式,还有一个细节 post(Runable)的message是 Message.obtain()获取的,这个message可以复用,所以在使用的时候尽量也用这种方式,节约资源,算是个小技巧吧。

你可能感兴趣的:(源码解析,android,Handler)