关于mIdleHandlers 空闲消息

Posted 小人物702

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于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中的空闲消息了

 

以上是关于关于mIdleHandlers 空闲消息的主要内容,如果未能解决你的问题,请参考以下文章

5netty第四个例子,空闲检测handle

有没有办法强制 Win32 计时器在不空闲时执行?

Android中Handle详解

Handle/Looper源码分析;

Android中的Handle(句柄)

handle机制的原理