android项目实例源码 android源码怎么运行( 二 )



?

android项目实例源码 android源码怎么运行


消息发送
?

android项目实例源码 android源码怎么运行



android项目实例源码 android源码怎么运行


消息处理

android项目实例源码 android源码怎么运行



android项目实例源码 android源码怎么运行


?
?
消息阻塞和延时
Looper 的阻塞主要是靠 MessageQueue 来实现的,在next()@MessageQuese 进行阻塞,在 enqueueMessage()@MessageQueue 进行唤醒 。主要依赖 native 层的 Looper 依靠 epoll 机制进行的 。
Message next() {int pendingIdleHandlerCount = -1; // -1 only during first iterationint nextPollTimeoutMillis = 0;for (;;) {if (nextPollTimeoutMillis != 0) {Binder.flushPendingCommands();}//阻塞和延时,主要是next()中nativePollOnce(ptr, nextPollTimeoutMillis)调用naive方法操作管道nativePollOnce(ptr, nextPollTimeoutMillis);} }
android项目实例源码 android源码怎么运行


阻塞和延时,主要是next()中nativePollOnce(ptr, nextPollTimeoutMillis)调用naive方法操作管道,由nextPollTimeoutMillis决定是否需要阻塞nextPollTimeoutMillis为0的时候表示不阻塞,为-1的时候表示一直阻塞直到被唤醒,其他时间表示延时 。
唤醒
主要是指enqueueMessage()@MessageQueue 进行唤醒 。
boolean enqueueMessage(Message msg, long when) {//在这里唤醒阻塞的方法if (needWake) {nativeWake(mPtr);}}
android项目实例源码 android源码怎么运行


简单理解阻塞和唤醒 就是在主线程的MessageQueue没有消息时,便阻塞在loop的queue.next()中的nativePollOnce()方法里,此时主线程会释放CPU资源进入休眠状态,直到下个消息到达或者有事务发生,通过往pipe管道写端写入数据来唤醒主线程工作 。这里采用的epoll机制,是一种IO多路复用机制,可以同时监控多个描述符,当某个描述符就绪(读或写就绪),则立刻通知相应程序进行读或写操作,本质同步I/O,即读写是阻塞的 。所以说,主线程大多数时候都是处于休眠状态,并不会消耗大量CPU资源 。从阻塞到唤醒,消息切换

android项目实例源码 android源码怎么运行


?
延时入队

android项目实例源码 android源码怎么运行


?
主要指enqueueMessage()消息入列是,上图代码对message对象池的重新排序,遵循规则(when从小到大) 。此处for死循环退出情况分两种 第一种:p==null表示对象池中已经运行到了最后一个,无需再循环 。第二种:碰到下一个消息when小于前一个,立马推出循环(不管对象池中所有message是否遍历完),进行重新排序 。

推荐阅读