广告
返回顶部
首页 > 资讯 > 精选 >Android中View.post和Handler.post的关系是什么
  • 940
分享到

Android中View.post和Handler.post的关系是什么

2023-06-30 18:06:19 940人浏览 八月长安
摘要

这篇文章主要介绍“Android中View.post和Handler.post的关系是什么”,在日常操作中,相信很多人在Android中View.post和Handler.post的关系是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好

这篇文章主要介绍“Android中View.post和Handler.post的关系是什么”,在日常操作中,相信很多人在Android中View.post和Handler.post的关系是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Android中View.post和Handler.post的关系是什么”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

为什么要拿这二者来比较?

首先,这二者的名字相同

其次,是View.post()的调用时机和整个View的绘制和渲染有着千丝万缕的联系。而这一切的基础,正是主线程的Handler.post(),理清这二者的关系,能够加深我们对View渲染、绘制的流程的理解。

View的渲染起点

宏观上来说,当DecorView被”attach“到Window之上后,程序能够收到系统分配给各个Activity的同步信号时,View就会开始渲染了,当每个同步信号到来时,ChoreoGrapher将会派发出一个信号通知ViewRootImpl进行视图的渲染,因此,从系统上来看,每次释放的Vsync同步信号应该是视图绘制的起点。

从App端来说,当ScheduleTravesals被调用时,会先向MessageQueue中插入一个消息屏障,此时会阻隔其他的同步消息的通过,允许异步消息的进入。然后mChoreoGrapher,向MessageQueue中插入一个视图更新的信号,最终会走到doTraversals()方法中,在该方法的执行过程中,将会先取消掉同步屏障,然后紧接着执行perfORMTraversals()方法。显然,消息屏障的作用就是提升peformTraversals的优先级,确保视图的优先绘制。

不难发现,真正的进行渲染的起点是perfromTraversals()方法:

Android中View.post和Handler.post的关系是什么

View.post的执行流程

View.post在不同版本的Android系统中,有着不同的实现,在api24以前,View.post所做的是:当View.post被调用时,直接向ViewRootImpl的mRunQueue中插入一个Runnable,然后在performTraversals()过程中,统一进行处理,这样一来,View.post()就会按照View.post()的调用顺序在”未来的某个时间点“进行执行,这说明:在这一系列的Android版本中,View.post的执行顺序就是本身调用View.post()的顺序

处理:这里的处理并非直接执行Runnable,而是统一插入到主线程的MessageQueue中去执行;

“未来的某个时间点”,这个未来的某个时间点指的是perfromTraversals()中将ViewRootImpl中mRunQueue中的所有Runnable插入到MessageQueue之后的某个时间点。必然在performTraversals()之后。

Android中View.post和Handler.post的关系是什么

如上图,必须得等到整个perfromTraversals方法体执行完成(包括)后,才有可能执行下一个Message(这里标注为了Runnable),而perfromTraversals()方法体中,会顺序地调用performMeasure()、performLayout()、performDraw()方法,这三个方法走完,意味着视图已经完成了渲染,此时的View.post()执行,必然是能落在视图创建之后

而API24及之后的版本中,View.post所做的事情发生了改变,当View.post()调用时,Runnable被插入到View各自的mRunQueue当中,也就是说,每个View都含有一个mRunQueue,当performTraversals()中,也没有统一处理了,而是根据 performTraversals()->dispatchAttachedTowindows()递归地调用到子View时,子View将自己的mRunQueue插入到主线程的MessageQueue,这意味着:在高版本的执行过程中,View.post()的执行顺序是按照视图被迭代到的顺序。

不变的是View.post()执行,必然是能落在视图创建之后,这也是为什么能够调用View.post()来获取一些屏幕上的View的数据的原因。

Handler.post()能像View.post()一样获取到宽、高数据吗?

Activity为我们暴露了三个常用的生命周期函数:onCreate()、onStart()、onResume()。通常我们对一些事件的监听、View的初始化设置都会在这三个生命周期函数中实现,以最后执行的onReumse()为例,我们在其中使用主线程的Handler.post()获取一个视图的数据,

我们可以看看结果:

    override fun onResume(){        super.onResume()        Handler(Looper.getMainLooper()).post{            Log.d("getHeight",textView.height.toString())        }    }
  D/getHeight: 0

显然,失败了。

我们知道,一个的Activity的创建初期,DecorView并不会直接就和Activity建立联系,建立联系的过程在handleResumeActivity()当中,此时的DecorView被attach到了Activity之上。但是,我们需要明确一点:一个View如果没有和Activity建立联系,那么它将收不到系统的同步信号,也就无法更新(更新也没有意义,因为它没有地方去显示),我们看看handleResumeActiivty的执行方法体,可以发现,先走了onResume()的回调,再走了a.mDecor = decor这一步骤,上文我们提到,视图更新的事件是以Message的形式,在MessageQueue中”排队“的,如果我们在onResume()中插入一个消息去获取渲染之后的宽高数据,那么这时的MessageQueue大概是这样:

Android中View.post和Handler.post的关系是什么

当前正在执行的是黄色的Message,这是一个从ActivityThread.java中H类发出的调度方法,它将会调用到handleResumeActivity中的一系列方法,最终走到onResume这,我们使用Handler.post(),我们会发现消息被插在了黄色的Message之后,但是此时的a.mDecor = decor还没有执行,更不可能已经发生绘制了,这也就意味着压根没渲染,没视图,自然也没数据,完整的流程如下:

Android中View.post和Handler.post的关系是什么

到此,关于“Android中View.post和Handler.post的关系是什么”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注编程网网站,小编会继续努力为大家带来更多实用的文章!

--结束END--

本文标题: Android中View.post和Handler.post的关系是什么

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

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

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

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

下载Word文档
猜你喜欢
  • Android中View.post和Handler.post的关系是什么
    这篇文章主要介绍“Android中View.post和Handler.post的关系是什么”,在日常操作中,相信很多人在Android中View.post和Handler.post的关系是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好...
    99+
    2023-06-30
  • Android中View.post和Handler.post的关系
    目录前言为什么要拿这二者来比较?View的渲染起点View.post的执行流程Handler.post()能像View.post()一样获取到宽、高数据吗?前言 View.po...
    99+
    2022-06-07
    view 关系 handler post Android
  • android中handler.post和handler.sendMessage的区别是什么
    本篇文章给大家分享的是有关android中handler.post和handler.sendMessage的区别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。 异步更新U...
    99+
    2023-05-30
    android handler.post
  • Android中同步与异步的关系是什么
    本篇文章为大家展示了Android中同步与异步的关系是什么,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。android 只有UI线程可以刷新界面,其他副线程不行,这样就需要副线程通过通信消息修改刷新...
    99+
    2023-06-19
  • opencv和ffmpeg的关系是什么
    OpenCV和FFmpeg是两个不同的开源项目,它们都是用于处理图像和视频的库。OpenCV是一个用于计算机视觉和机器学习的库,提供...
    99+
    2023-10-20
    opencv ffmpeg
  • reactnative和react的关系是什么
    React Native是基于React开发的一种移动应用开发框架。它允许开发者使用React的语法和组件模型来构建原生移动应用。R...
    99+
    2023-10-08
    react
  • springboot和mybatis的关系是什么
    Spring Boot和MyBatis的关系是,Spring Boot是一个用于简化Spring应用程序开发的框架,而MyBatis...
    99+
    2023-10-11
    springboot mybatis
  • ES5和JavaScript的关系是什么
    这篇文章主要介绍“ES5和JavaScript的关系是什么”的相关知识,小编通过实际案例向大家展示操作过程,操作方法简单快捷,实用性强,希望这篇“ES5和JavaScript的关系是什么”文章能帮助大家解决...
    99+
    2022-10-19
  • bootstrap和less的关系是什么
    这篇文章主要讲解了“bootstrap和less的关系是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“bootstrap和less的关系是什么”吧! ...
    99+
    2022-10-19
  • mysql和Navicat的关系是什么
    这篇文章将为大家详细讲解有关mysql和Navicat的关系是什么,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。  MySQL是一个关系型数据库管理系统。而Navicat...
    99+
    2022-10-18
  • npm和node.js的关系是什么
    这篇文章主要介绍“npm和node.js的关系是什么”,在日常操作中,相信很多人在npm和node.js的关系是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”npm和no...
    99+
    2022-10-19
  • git和github的关系是什么
    本篇内容介绍了“git和github的关系是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!git和github的关系是:github是基...
    99+
    2023-07-02
  • java和javascript的关系是什么
    本篇内容介绍了“java和javascript的关系是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!Java 和 JavaScript ...
    99+
    2023-06-20
  • python中类和对象的关系是什么
    在Python中,类是对象的蓝图或模板,而对象是类的实例。类定义了对象的属性和方法。通过创建一个对象,可以使用类中定义的属性和方法。...
    99+
    2023-09-15
    python
  • Spring Security中WebSecurity和HttpSecurity的关系是什么
    这篇文章给大家分享的是有关Spring Security中WebSecurity和HttpSecurity的关系是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。前几天有粉丝私...
    99+
    2022-10-19
  • Python 关键字和 IDE 的关系是什么?
    Python 是一种流行的编程语言,同时也是数据科学、Web 开发、人工智能和机器学习等领域中最受欢迎的语言之一。Python 语言的特点之一是简洁、易读和易于学习,这使得它成为许多开发人员的首选语言。Python 语言中有一些特殊的单词...
    99+
    2023-08-01
    关键字 存储 ide
  • Linux系统中的索引和PHP的关系是什么?
    在Linux系统中,索引是非常重要的一个概念。索引可以帮助我们快速地查找和访问文件和目录,从而提高了系统的性能和效率。与此同时,在PHP中,索引也是一个非常重要的概念。在PHP中,我们可以使用数组和其他数据结构来实现索引,以便更加方便地访...
    99+
    2023-10-16
    unix 索引 linux
  • laravel和php是什么关系
    本教程操作环境:windows7系统、Laravel6&&PHP7.1版、Dell G3电脑。Laravel 是 Taylor Otwell 开发的一款基于 PHP 语言的 Web 开源框架,采用了 MVC 的架构模式。它可...
    99+
    2019-08-07
    laravel php
  • pdo和mysql是什么关系
    PDO和MySQL之间的关系是,PDO是PHP的数据库访问抽象层,而MySQL是一种具体的关系型数据库管理系统,通过PDO可以方便地连接MySQL数据库,进行数据库查询和管理,而不需要关注具体的数据库类型和实现细节。本教程操作系统:Wind...
    99+
    2023-08-01
  • DB、DBMS和DBS的关系是什么
    这篇文章主要介绍DB、DBMS和DBS的关系是什么,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!DB、DBMS和DBS三者之间的关系是:DBS包括DB和DBMS。DBS是指数据库系统...
    99+
    2022-10-18
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作