本文主要是介绍Handler的post与sendMessage的区别和应用场景,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Handler的post与sendMessage的区别和应用场景
区别在于post实现起来比较简单。而sendMessage()则需要自己重写handleMessage()方法。
两者在本质上都没有什么区别。post方法适合单一的场景,实现起来比较方便。sendMessage()适合需要作条件判断的场景。
handler postDealy后消息队列有什么变化,假设先 postDelay 10s, 再postDelay 1s, 怎么处理这2条消息?
postDelayed传入的时间,会和当前的时间做加和,而不是单纯的只是用延时时间。
- 延时消息会和当前消息队列里的消息头的执行时间做对比,如果比头的时间靠前,则会做为新的消息头,不然则会从消息头开始向后遍历,找到合适的位置插入延时消息。 postDelay()一个10秒钟的Runnable A、消息进队,MessageQueue调用nativePollOnce()阻塞,Looper阻塞;
- 紧接着post()一个Runnable B、消息进队,判断现在A时间还没到、正在阻塞,把B插入消息队列的头部(A的前面),然后调用nativeWake()方法唤醒线程;
- MessageQueue.next()方法被唤醒后,重新开始读取消息链表,第一个消息B无延时,直接返回给Looper; Looper处理完这个消息再次调用next()方法,MessageQueue继续读取消息链表,第二个消息A还没到时间,计算一下剩余时间(假如还剩9秒)继续调用nativePollOnce()阻塞;
- 直到阻塞时间到或者下一次有Message进队;
这篇关于Handler的post与sendMessage的区别和应用场景的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!