广告
返回顶部
首页 > 资讯 > 前端开发 > JavaScript >使用View.post()需要注意什么
  • 373
分享到

使用View.post()需要注意什么

2024-04-02 19:04:59 373人浏览 独家记忆
摘要

这篇文章给大家分享的是有关使用View.post()需要注意什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言有时候,我们会需要用到 View.post() 方法,来将一

这篇文章给大家分享的是有关使用View.post()需要注意什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。

一、前言

有时候,我们会需要用到 View.post() 方法,来将一个 Runnable 发送到主线程去执行。这一切,看似很美好,它最终会通过一个 Handler.post() 方法去执行,又避免我们重新定义一个 Handler 对象。

但是,从 Android 7.0(api level 24) 开始,View.post() 将不再那么靠谱了,你 post() 出去的 Runnable ,可能永远也不会有机会执行到。

二、post 在 7.0 的差异

2.1 post 方法的差异

前面提到,这个问题只出现在 Android 7.0 上。那么就先从源码分析 Android 7.0 到底对 View.post() 做了什么改动。

使用View.post()需要注意什么

用 Diff 看一下它们的差异,左边是 Api Level 24+(以下简称 Api24) 的代码,右边是 Api level 23-(以下简称 Api23) 的代码。

很明显的可以看出来,它们只有在 mAttachInfo 为 null 的时候,执行的逻辑才会有差异。

Api24 中,会调用 getRunQueue().post(action),而 Api23 会调用 ViewRootImpl.getRunQueue().post(action) 方法,他们的差异就在这里。

2.2 Api23 post 的细节

先简单理解一下,ViewRootImpl 是什么。

ViewRootImpl 可以理解是一个 Activity 的 ViewTree 的根节点的实例。每个 ViewRootImpl 就是用来管理 DecorView 和 ViewTree。

ViewRootImpl 中的用来承载 Runnable 的队列是 sRunQueues ,它一个静态的变量,也就是说在 App 的生命周期内,ViewRootImpl 中的这个消息队列都是同一个。

再来看看前面提到的 ViewRootImpl.getRunQueue().post() 到底干了什么?

使用View.post()需要注意什么

post() 方法只是单纯的将它包装成一个 HandlerAction 对象,然后放入 Mactions 这个 ArrayList 中。继续追查下去就需要知道 mActions 中添加的 HandlerAction 在何时被消费掉了。

消费 HandlerAction 的地方,是 executeActions() 方法。

使用View.post()需要注意什么它最终,还是调用的 handler.postDelayed() ,这没什么好说的,关键点在于 executeAction() 方法,是在什么时候被调用的。

executeAction() 是被 TraversalRunnable 调用 doTraversa() ,在doTraversa() 方法中,进行调用的。而 TraversalRunnable 又是通过 Choreographer.postCallBack() 去循环调用的。这个 Choreographer 通过 doScheduleCallback() 发送一个 MSG_DO_SCHEDULE_CALLBACK 类型的消息循环调用,间隔就是一个 VSync 的间隔。

关于 Choreographer ,不是本文的重点,有兴趣可以单独了解一下。

所以,在 Api23 以下,executeAction() 是会被循环调用,基本上其内的 mActions 只要有未执行的 Runnable 立刻就会被消费掉。

所以在 Api23 以下的设备上,View.post() 基本上是靠谱的,post 出去的 Runnable 都会有机会执行到。

2.3 Api24 的细节

再来看看在 Api24 中的实现细节,在 Api24 中,调用的是 getRunQueue().post() 方法,它操作的是一个 HandlerActionQueue 对象。

使用View.post()需要注意什么

内部的结构其实和 Api23 很像,也是维护了一个 HandlerAction 的数组 mActions 。

最终消费掉 mActions 的地方,依然是一个 executeActions() 方法。

使用View.post()需要注意什么

回到根本的问题,executeActions() 方法在什么时机会被调用到,继续追查可以看到它在 View.dispatchAttachedToWindow() 方法中,会被调用。

使用View.post()需要注意什么

既然,executeActions() 方法,在 Api24 及以上,只会在 dispatchAttachedToWindow() 的方法中,才有机会被调用到,而 View.dispatchAttachedToWindow() 方法,只有在这个 View 通过 addView() 等方法,加入到一个 ViewGroup 的时候,才会被调用到。这就导致写在 Layout 布局中的控件,是不会有机会再调用 addView() 方法的,所以它永远也得不到执行。这也就到时了 Api24 下,View.post() 表现的现象不一致的缘故。

感谢各位的阅读!关于“使用View.post()需要注意什么”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,让大家可以学到更多知识,如果觉得文章不错,可以把它分享出去让更多的人看到吧!

--结束END--

本文标题: 使用View.post()需要注意什么

本文链接: https://www.lsjlt.com/news/80934.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 使用View.post()需要注意什么
    这篇文章给大家分享的是有关使用View.post()需要注意什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。一、前言有时候,我们会需要用到 View.post() 方法,来将一...
    99+
    2022-10-19
  • 使用HTML5 Canvas需要注意什么
    小编给大家分享一下使用HTML5 Canvas需要注意什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧! 下面对我们在实际开发...
    99+
    2022-10-19
  • 使用ADO.NET时需要注意什么
    小编给大家分享一下使用ADO.NET时需要注意什么,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!使用ADO.NET时,出现了一个严重的问题,ADO.NET统一了数...
    99+
    2023-06-17
  • C#中使用CLR需要注意什么
    这篇文章主要为大家展示了“C#中使用CLR需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“C#中使用CLR需要注意什么”这篇文章吧。1、C# CLR之foreach的性能问题 fore...
    99+
    2023-06-17
  • 使用react框架需要注意什么
    这篇文章主要为大家展示了“使用react框架需要注意什么”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“使用react框架需要注意什么”这篇文章吧。这篇文章主要是...
    99+
    2022-10-19
  • VS2003版本使用需要注意什么
    这篇文章主要讲解了“VS2003版本使用需要注意什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“VS2003版本使用需要注意什么”吧!VS2005可以很方便的帮我们把VS2003开发的as...
    99+
    2023-06-17
  • java中CAS使用需要注意什么
    这篇文章将为大家详细讲解有关java中CAS使用需要注意什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。Java有哪些集合类Java中的集合主要分为四类:1、List列表:有序的,可重复的;2、Queu...
    99+
    2023-06-14
  • 使用Linux桌面需要注意什么
    这篇文章主要介绍使用Linux桌面需要注意什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!这个问题没有轻松的答案,如果你是新用户,之前没有用过任何Linux桌面,更是这样。围绕这个话题而写的文章大多数也没有多大帮助...
    99+
    2023-06-10
  • js使用语法需要注意什么
    本篇内容介绍了“js使用语法需要注意什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!说明在js中严格区分大小写。其实这是用来排错的。正常写...
    99+
    2023-06-20
  • Kali Linux需要注意什么
    这期内容当中小编将会给大家带来有关Kali Linux需要注意什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Kali Linux 在渗透测试和白帽子方面是业界领先的 Linux 发行版。默认情况下,该...
    99+
    2023-06-28
  • Xamarin.Forms使用Slider需要注意什么问题
    这篇文章主要为大家展示了“Xamarin.Forms使用Slider需要注意什么问题”,内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下“Xamarin.Forms使用Slider需要注意什么问题”这篇...
    99+
    2023-06-04
  • DLOG4J在使用MySQL时需要注意什么
    这篇文章主要介绍“DLOG4J在使用MySQL时需要注意什么”,在日常操作中,相信很多人在DLOG4J在使用MySQL时需要注意什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解...
    99+
    2022-10-18
  • 使用免费空间需要注意什么
    使用免费空间需要注意:1、选择免费空间时需要了解清楚申请规则,提高开通空间的效率;2、选择免费空间没有直接利润,因此主机商提供的售后服务相对比较慢;3、在使用免费空间过程中如果有疑问,主机商不提供教学义务,需要自行解决问题;4、免费空间性能...
    99+
    2022-10-17
  • 注册域名需要注意什么
    本篇内容介绍了“注册域名需要注意什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!第一,域名注册商的时候,要了解该注册的品牌。尽量挑选老练,...
    99+
    2023-06-06
  • mysql建表需要注意什么
    本篇文章和大家了解一下mysql建表需要注意什么。有一定的参考价值,有需要的朋友可以参考一下,希望对大家有所帮助。一、mysql各个名称库名、表名、字段名全部使用小写字母,用'_'下划线分割...
    99+
    2022-10-18
  • Access转SqlServer需要注意什么
    本篇内容介绍了“Access转SqlServer需要注意什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!...
    99+
    2022-10-18
  • seo建站需要注意什么
    seo建站时需要注意以下几个点网站布局网站的内容布局模式,一般采用扁平化的树形模式,将重要的文章和栏目布局到首页,通过首页点击栏目进入到列表页,有利于蜘蛛抓取页面。代码编写的格式seo建站一般采用DIV+CSS的模式来进行代码的编写,使网站...
    99+
    2022-10-07
  • html5测试需要注意什么
    这篇文章主要介绍“html5测试需要注意什么”,在日常操作中,相信很多人在html5测试需要注意什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”html5测试需要注意什么”的疑惑有所帮助!接下来,请跟着小编...
    99+
    2023-06-05
  • 初学J2ME需要注意什么
    这篇文章主要讲解了“初学J2ME需要注意什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“初学J2ME需要注意什么”吧!  下面请看一段代码:    import javax.microed...
    99+
    2023-06-03
  • URL优化需要注意什么
    本篇内容介绍了“URL优化需要注意什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!  1,URL要简短,越短越好  无论是用户还是搜索引擎...
    99+
    2023-06-10
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作