• 关于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中的空闲消息了

  • 相关阅读:
    module.exports和exports的区别
    draggable实现拖拽
    网关统一配置跨域支持
    adroid
    matplotlib 显示中文
    github 下载慢怎么办
    C++中的位运算总结
    batch change commit author
    上三角
    计算某个月有多少天
  • 原文地址:https://www.cnblogs.com/xiaorenwu702/p/5879799.html
Copyright © 2020-2023  润新知