Handler进阶之sendMessage原理探索

Handler进阶之sendMessage原理探索Handler 进阶之 sendMessage 本文主要进一步的探索 Handler 主要介绍下 Handler 是如何发送消息的 用过 Handler 的想必对一下几个方法都不会陌生 sendMessage Messagemsg 立刻发送消息 sendMessageA Messagemsg longatTime 在某个时间点发送消息 sendMessageD

Handler进阶之sendMessage


sendMessage(Message msg);//立刻发送消息 sendMessageAtTime(Message msg, long atTime);//在某个时间点发送消息 sendMessageDelayed(Message msg, long delayedTime);//在当前时间点延迟一段时间发送消息 

 以上是三个Handler发送消息的方法,区别在于发送的时间点不一致,但其实三个方法在最终都是执行Handler内的同一个方法,只是在参数上稍有区别:

public final boolean sendMessageDelayed(Message msg, long delayMillis) { 
     if (delayMillis < 0) { 
     delayMillis = 0; } return sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis); } sendMessage(Message msg); //对应 sendMessageDelayed(msg, 0)sendMessageAtTime(Message msg, long atTime); //对应 sendMessageDelayed(msg, atTime) sendMessageDelayed(Message msg, long delayedTime); //对应 sendMessageDelayed(msg, SystemClock.uptimeMillis() + delayedTime) 

Handler消息机制原理全方面解读

 此处直接看Message放入MessageQueue的过程:

boolean enqueueMessage(Message msg, long when) { ...//代码较多,省去了部分抛出异常的代码 synchronized (this) { ... msg.markInUse(); msg.when = when; Message p = mMessages; boolean needWake; if (p == null || when == 0 || when < p.when) { // New head, wake up the event queue if blocked. msg.next = p; mMessages = msg; needWake = mBlocked; } else { // Inserted within the middle of the queue. Usually we don't have to wake // up the event queue unless there is a barrier at the head of the queue // and the message is the earliest asynchronous message in the queue. needWake = mBlocked && p.target == null && msg.isAsynchronous(); Message prev; for (;;) { prev = p; p = p.next; if (p == null || when < p.when) { break; } if (needWake && p.isAsynchronous()) { needWake = false; } } msg.next = p; // invariant: p == prev.next prev.next = msg; } // We can assume mPtr != 0 because mQuitting is false. if (needWake) { nativeWake(mPtr); } } return true; } 

 重点就在if-else这里,将它们一个一个拆开来看:

if (p == null || when == 0 || when < p.when) {//p是当前MessageQueue队首Message // New head, wake up the event queue if blocked. msg.next = p; mMessages = msg; needWake = mBlocked; } 
 needWake = mBlocked && p.target == null && msg.isAsynchronous(); Message prev; for (;;) { prev = p; p = p.next; if (p == null || when < p.when) { break; } if (needWake && p.isAsynchronous()) { needWake = false; } } msg.next = p; // invariant: p == prev.next prev.next = msg; 

之所以写这篇文章主要是为了解答两个问题。

  1. sendMessageDelayed是如何实现延时发送消息的?
  2. sendMessageDelayed是通过阻塞来达到了延时发送消息的结果,那么会不会阻塞新添加的Message?

总结:

  1. Handler在发送消息的时候,MessageQueue里的消息是按照发送时间点从小到大排列的,
    如果最近的Message未到达发送的时间则阻塞。
  2. 新加入的数据会根据时间点的大小判断需要插入的位置,同时还需要判断是否需要唤醒线程去发送当前的队首的消息。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/232076.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++/C与Java的区别

    C++/C与Java的区别Java是由C++发展而来的,保留了C++的大部分内容,其编程方式类似于C++。但Java的句法更清晰、规模更小、更易学。Sun公司曾对多种程序设计语言进行分析研究,取其精华去其糟粕,最终推出了Java。Java从根本上解决了C++的固有缺陷,形成了新一代面向对象的程序设计语言(当然了解决问题也是需要代价的)。一、跨平台(C\C++和Java)Java是基于JVM虚拟机的跨…

    2022年7月7日
    25
  • 就这样CSDN账号被人盗了??

    就这样CSDN账号被人盗了??

    2022年1月19日
    53
  • 大数据可视化的方法、挑战及进展[通俗易懂]

    大数据可视化的方法、挑战及进展[通俗易懂]大数据可视化的方法、挑战及进展摘要:在简化数据量和降低大数据应用的复杂性中,大数据分析发挥着关键的作用。可视化是其中一个重要的途径,它能够帮助大数据获得完整的数据视图并挖掘数据的价值。大数据分析和可视化应该无缝连接,这样才能在大数据应用中发挥最大的功效。这篇文章将介绍一些常规的数据可视化方法以及在大数据应用领域突破常规的可视化手段,也会讨论大数据可视化带来的挑战,同时介绍大数据可视化领域新的方

    2022年5月4日
    62
  • python人机交互式编程_python运行的两种方式交互式

    python人机交互式编程_python运行的两种方式交互式在PyCharm下使用ipython交互式编程的方法目的:方便调试,查看中间结果,因为觉得设断点调试相对麻烦。【运行环境:macOS10.13.3,PyCharm2017.2.4】老手:选中代码行,Alt+Shift+E。或选中,鼠标右键-ExecuteLineinConsole。新手:1、安装ipython之后,查看PyCharm设置,确保Console的通用设置Us…

    2022年8月27日
    3
  • sift构建尺度空间_离散序列的尺度变换

    sift构建尺度空间_离散序列的尺度变换尺度空间定义  说到尺度空间理论最早可以追溯到1962年的T.Iijima最先提出,学术界开始关注尺度空间技术主要在1986年IEEEPAMI上同时刊出的4篇关于尺度空间理论的文章奠定了发展基础。现实世界中物体只有具备一定的尺度才能够倍人眼所察觉,计算机视觉学术研究就是在不断的尝试与突破来模拟人眼的观察方法。因此,尺度空间就是试图在图像领域中模拟人眼观察物体的概念与方法。例如:观察一颗树,关…

    2022年10月14日
    4
  • 大数据去重方案

    大数据去重方案

    2021年11月22日
    69

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号