关于mIdleHandlers 空闲消息

模拟情况说明

创建一个handler对象 该handler持有的是主线程

1.先发送一个延时20秒的message what=35;
2.紧接着又发送一个延时10秒的Runnable
3.在该Runnable中的run方法中执行了添加一个空闲消息: handler.getLooper().myQueue().addIdleHandler(new MessageQueue. IdleHandler()

代码:
final Handler handler = new Handler(new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
System.out.println("消息的what-->>"+msg.what);
return false;
}
});
public void testHandler(){

Message message = Message.obtain() ;
message.what=35;
//发送一个延时的20秒的消息
handler.sendMessageDelayed(message,20*1000L);
myListView.postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("发送idel消息");
//发送一个空闲时执行的消息
handler.getLooper().myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
@Override
public boolean queueIdle() {
System.out.println("我是空闲消息");
return false;
}
});
}
},10*1000L);
}

************************************************************

这3个消息的执行过程:

MessageQueue 中成员变量 mMessages 消息列队模拟如下
message0( runnable) 10秒后执行
message1( what =35)的消息 20秒后执行

mIdleHandlers 空闲消息集合此时为空

当10秒后 message0 触发 ,此时在MessageQueue的成员变量mIdleHandlers中添加了 空闲消息

message0 执行完毕后 looper再次循环, 调用MessageQueue.next();
此时发现 message1 还有10秒才执行 所以执行了nextPollTimeoutMillis = (int) Math.min(msg.when - now, Integer.MAX_VALUE);
那么毫无疑问 nextPollTimeoutMillis =10秒钟了 关键是 代码继续执行, 就执行到了刚刚添加到mIdleHandlers中的空闲消息了

时间: 2024-08-08 00:40:21

关于mIdleHandlers 空闲消息的相关文章

操作系统课程设计 消息缓冲队列通信

消息缓冲队列通信机制其基本思想是根据“生产者——消费者”原理,利用内存中公用消息缓冲区实现进程间的信息交换. 在这种通信机制中,首先需要在内存中开辟若干空闲消息缓冲区,用以存放要通信的消息.每当一个进程需要向另一个进程发送消息时,便向系统申请一个空闲消息缓冲区,并把已准备好的消息复制到该缓冲区,然后把该消息缓冲区插入到接收进程的消息队列中,最后通知接收进程.接收进程接收到发送进程发来的通知后,从本进程的消息队列中摘下一消息缓冲区,取出其中的信息,然后把消息缓冲区作为空闲消息缓冲区归还给系统.系统

android 消息系统Handler、MessageQueue、Looper源码学习

android消息系统 整体框架如图所示 在安卓的消息系统中,每个线程有一个Looper,Looper中有一个MessageQueue,Handler向这个队列中投递Message,Looper循环拿出Message再交由Handler处理.整体是一个生产者消费者模式,这四部分也就构成了android的消息系统. 先来看一个最简单的例子 //这段代码在某个Activity的onCreate中 Handler handler = new Handler(Looper.getMainLooper()

【TencentOS tiny】深度源码分析(4)——消息队列

消息队列 在前一篇文章中[TencentOS tiny学习]源码分析(3)--队列 我们描述了TencentOS tiny的队列实现,同时也点出了TencentOS tiny的队列是依赖于消息队列的,那么我们今天来看看消息队列的实现. 其实消息队列是TencentOS tiny的一个基础组件,作为队列的底层. 所以在tos_config.h中会用以下宏定义: #if (TOS_CFG_QUEUE_EN > 0u) #define TOS_CFG_MSG_EN 1u #else #define T

C++ 中超类化和子类化常用API

在windows平台上,使用C++实现子类化和超类化常用的API并不多,由于这些API函数的详解和使用方法,网上一大把.本文仅作为笔记,简单的记录一下. 子类化:SetWindowLong,GetWindowLong,CallWindowProc,FindWindowEx 超类化:GetClassInfoEx,RegisterClassEx,UnRegisterClass 以上函数在代码中的使用见<C++ 中超类化和子类化> VC中基于SDK编程的窗口子类化 VC中基于SDK编程的窗口子类化的

RT-thread内核之进程间通信

这里面见到的同步和互斥的概念非常清晰,转载自: http://www.cnblogs.com/King-Gentleman/p/4311582.html 一.进程间通信机制 rt-thread操作系统的IPC(Inter-Process Communication,进程间同步与通信)包含有中断锁.调度器锁.信号量.互斥锁.事件.邮箱.消息队列.其中前5个主要表现为线程间同步,邮箱与消息队列表现为线程间通信.本文主要介绍它们的一些特性及使用场合. 1.中断锁 关闭中断也叫中断锁,是禁止多任务访问临

MFC窗口风格 WS_style/WS_EX_style(超详细)

窗口风格(Window style) WS_BORDER   有边框窗口 WS_CAPTION   必须和WS_BORDER风格配合,但不能与WS_DLGFRAME风格一起使用.指示窗口包含标题要部分. WS_CHILD   说明窗口为子窗口,不能应用于弹出式窗口风格(WS_POPUP). WS_CHILDWINDOW   同WS_CHILD. WS_CLIPCHILDREN   绘制父窗口时,不绘制子窗口的裁剪区域.使用在建立父窗口时. WS_CLIPSIBLINGS 剪裁相关的子窗口,这意味

Socket同步 异步通信

MFC对SOCKET编程的支持其实是很充分的,然而其文档是语焉不详的.以至于大多数用VC编写的功能稍 复杂的网络程序,还是使用API的.故CAsyncSocket及CSocket事实上成为疑难,群众多敬而远之.余 好事者也,不忍资源浪费,特为之注解. 一.CAsyncSocket与CSocket的区别 前者是异步通信,后者是同步通信:前者是非阻塞模式,后者是阻塞模式.另外,异步非阻塞模式有 时也被称为长连接,同步阻塞模式则被称为短连接.为了更明白地讲清楚两者的区别,举个例子: 设想你是一位体育老

MFC对Socket编程的支持

MFC对Socket编程的支持其实是很充分的,然而其文档是语焉不详的.以至于大多数用Visual C++编写的功能稍复杂的网络程序,还是使用其API的.故CAsyncSocket及CSocket事实上成为了疑难,群众多敬而远之.余好事者也,不忍资源浪费,特为之注解. 1.CAsyncSocket与CSocket的区别是前者是异步通信,后者是同步通信.前者是非阻塞模式,后者是阻塞模式.另外,异步非阻塞模式有时也被成为长连接,同步阻塞模式则被成为短连接. 为了更明白的讲清楚两者的区别.举个例子.设想

[转载]CAsyncSocket及CSocket注解

MFC疑难注解:CAsyncSocket及CSocket MFC对SOCKET编程的支持其实是很充分的,然而其文档是语焉不详的.以至于大多数用VC编写的功能稍复杂的网络程序,还是使用API的.故CAsyncSocket及CSocket事实上成为疑难,群众多敬而远之.余好事者也,不忍资源浪费,特为之注解. 一.CAsyncSocket与CSocket的区别 前者是异步通信,后者是同步通信:前者是非阻塞模式,后者是阻塞模式.另外,异步非阻塞模式有时也被称为长连接,同步阻塞模式则被称为短连接.为了更明