Handler消息机制之epoll机制

Handler作为Android系统最基本的消息处理机制,管理着整个应用程序的运行。应用程序中的任何操作包括:用户的点击事件,触摸事件,页面跳转等等,都会作为Message进入消息队列,最后被Handler处理。可以说Handler负责整个系统的运行。如果当系统中没有任何消息需要处理的时候,消息队列一直轮询会消耗CPU资源。那么Android系统是如果避免CPU浪费资源的? 我们接着往下看。
今天要给大家介绍的就是Handler底层的epoll机制。在学习epoll机制之前,我们先了解一下Handler基本的消息处理机制,如下图所示:
 

 
Handler里面维持了一个消息队列MessageQueue,通过Looper不断的插入消息,取出消息。代码如下。(MessageQueue.java)
 

image.png


当从MessageQueue中取出消息时先对检查消息执行的时间,如果时间还没到。则调用nativePollOnce方法使整个消息队列进入睡眠状态。
 

MessageQueue.java

private native void nativePollOnce(long ptr, int timeoutMillis); 


nativePollOnce方法是native方法,仅供jni调用,为了进一步Handler的底层实现原理,我们以Android10源码为例,进行深入理解。

image.png


当MessageQueue中没有Message需要处理或Message时间还没到时,调用java层的nativePollOnce方法。对应的JNI层中的 android_os_MessageQueue_nativePollOnce,在JNI的android_os_MessageQueue_nativePollOnce中调用nativeMessageQueue->pollOnce(env, obj, timeoutMillis),并传入对应的时间毫秒值。
我们接着往下看NativeMessageQueue里面是怎么处理的?
NativieMessageQueue.cpp

image.png


在NativeMessageQueue.pollOnce中调用了mLooper->pollOnce。进入Looper中。
Lopper.cpp


image.png


根据源码可以看出最后进入Looper.pollOnce的方法。在pollOnce中通过pollInner最终调用到epoll_wait,至此可以得出,Java层的nativePollOnce最终调用到JNI层的epoll_wait方法,并在在分析的过程中发现,JNI里面也有Looper。其他Java层的线程最终都是通过JNI调用pThread(感兴趣的同学可以查看JNI源码),对应的JNI也有和Java类名一样的线程相关类。
分析到这里,我们看到最终掉到JNI中的epoll_wait方法,那么这个epoll_wait到底是什么呢?

978 字

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值