如何才能做好品牌网站建设策划公司提供平台
如何才能做好品牌网站建设策划,公司提供平台,网易云服务器,织梦网站修改使用教程消息延时做了什么特殊处理#xff1f;是发送延时#xff0c;还是消息处理延时#xff1f;延时的精度如何#xff1f;通常我们使用Handler的消息延时都是调用sendMessageDelayed函数实现的#xff0c;其中delayMillis是需要延时的毫秒。通过跟踪sendMessageDelayed函数可以… 消息延时做了什么特殊处理是发送延时还是消息处理延时延时的精度如何通常我们使用Handler的消息延时都是调用sendMessageDelayed函数实现的其中delayMillis是需要延时的毫秒。通过跟踪sendMessageDelayed函数可以发现最终是调用到了上面这个enqueueMessage方法其中消息队列mMessages是单链表数据结果。从上面的源码中可以看到当前出入的消息msg时首先判断mMessages消息队列中的第一个消息mMessages.prev要是当前队列中消息为空或者msg立即发送则将该消息插到消息队列mMessages的头部反之则会在一个for的死循环中遍历消息队列并将传入消息msg插到单链表中合适的位置。事实上消息队列是按照消息处理的时间when按照从近到远的顺序排列的最先要执行的任务放在消息队列的头部依次排列。从上面可以看到Handler中sendMessageDelayed方法只是将消息按照要执行的先后顺序插入到消息队列中的插入好了并不意味着就会按照设定的延时时间处理消息那Handler时如何延时处理该消息的呢首先我们知道Looper.loop()之后线程就进入了消息监听的阶段当Handler中没有可用消息的时候上面代码会一直阻塞在queue.next()的地方直到消息返回才会调用dispatchMessage进行消息的处理要是返回的msg为空那么Handler就会结束消息监听不再监听任何消息。我们来看看queue.next()函数上面是阻塞的从消息队列中获取可用消息的过程。其中nativePollOnce方法是一个native方法其内部会根据传入的nextPollTimeoutMillis在延迟这么长时间之后唤醒线程从消息队列中读取消息内部调用的是epoll_wait方法。我们知道当线程中没有新消息要处理的时候线程处于休眠状态当其他线程向Handler的消息队列中写入消息这一动作并不会唤醒当前线程处理该消息还需要向线程的eventfd中写入数据从而唤醒休眠的线程开始处理数据此处也是一样的nativePollOnce函数内部会调用epoll_wait方法设置超时时间为nextPollTimeoutMillisepoll_wait在这个超时时间之后就会唤醒线程开始处理消息队列中的消息。next方法中每次会从消息队列mMessages中获取链表中头部的消息要是头部消息的设定执行的时间要比当前时间大说明消息队列中所有的消息都还没有到可执行的时间这是因为消息队列中消息在插入消息队列的时候按照执行时间的先后顺序已经排序好了。这种情况下会计算出一个等待时间传递到nativePollOnce函数中让native层在这个等待时间之后再唤醒线程读取消息队列中的消息进行消息处理。Handler的消息延时的实现消息队列在插入消息的时候是按照消息的触发时间顺序排序的先执行的消息放在单链表的头部最后执行的消息放在单链表的尾部在消息执行的过程中通过native层设置epoll_wait的超时事件使其在特定时间唤醒线程开始出现消息。关于延时精度Handler的延时精度并不高会受到前一个消息处理时间的影响因为在Looper.loop()方法中只有上一个消息被处理完之后才会去queue中读取下一个消息。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/85923.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!