首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在Activity.onCreate()中的setContentView()之后,Android什么时候会第一次调用View.onMeasure()?

在Activity.onCreate()中的setContentView()之后,Android会在下一次UI线程的循环中第一次调用View.onMeasure()。这是因为在Activity的生命周期中,setContentView()方法会将布局文件解析成View对象,并将其添加到Activity的视图层级中。但是,此时View还没有被测量,即还没有确定每个View的大小和位置。因此,Android会在下一次UI线程的循环中进行测量操作,即调用View.onMeasure()方法来测量每个View的大小和位置。这样才能确保在后续的布局和绘制过程中,每个View都能正确地显示在屏幕上。

在调用View.onMeasure()之后,Android会根据测量结果进行布局和绘制操作。首先,会调用View.onLayout()方法来确定每个View的位置。然后,会调用View.onDraw()方法来绘制每个View的内容。

需要注意的是,如果在Activity.onCreate()中使用了自定义的View,并且该View重写了onMeasure()方法,那么第一次调用View.onMeasure()会在setContentView()之后立即发生。这是因为自定义View的测量过程需要在布局解析之前完成。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Android之自定义View的死亡三部曲之Measure

我们在上一章节Android之View的诞生之谜中分析了系统从启动actiivty到调用setContentView加载我们的xml布局文件,但是此时我们的View是不可见的,因为我们还没有对其进行如下操作...,美美地出场—-绘制操作 OK,我们在上篇中分析道,系统加载好布局资源之后,会触发ViewRootImpl的performTraversals方法,在该方法内部会开始执行测量、布局、绘制的工作,也就是我们的死亡三部曲的开始...补充:在Android Touch事件分发机制详解之由点击引发的战争我们分析过DecorView实际是集成自FrameLayout,那么我们看frameLayout,发现frameLayout并没有measure...从上面我们看到,里面调用了onMeasure方法,这里要注意了: 我们的ViewGroup并没有重写View的onMeasure方法,而但是我们android开发中的四大布局 FrameLayout、LinearLayout...至此,View的三围已经测出来了,本篇略长,测量在android的死亡三部曲中是第一部,也是里面最复杂、重要的一部,快看下你的三围是多少吧!

37030
  • ❤️Android 性能优化之启动优化❤️

    之后,应用程序生成主线程,也称为UI线程,并将创建主Activity的任务交给它。 创建Activity 应用进程创建你的Activity后,Activity会执行以下操作: 初始化值。...调用构造函数。 调用 Activity 当前生命周期状态的回调方法,如 Activity.onCreate()。...查询的启动时间 初始显示时间(Time to initial display) 在 Android 4.4(API 级别 19)及更高版本中,logcat 包含一个输出行,其中包含一个名为 Displayed...第一次绘制你的应用程序。...在应用程序执行延迟加载的情况下,这可能很有价值。在延迟加载中,应用程序不会阻止窗口的初始绘制,而是异步加载资源并更新视图层次结构。 这里我在Activity.onCreate()中加了个工作线程。

    91860

    实现杂记(27):解决在onCreate()过程中获取View的width和Height为0的4种方法

    PS:这个文章是站在巨人的肩膀上抄袭的,之所以再次写,我是想分析:到底是在什么时候拿到宽高 下面的三种方法都经过实际测试,都是可以用的,输出结果如下: ?...从这个结果可以看出,都是在onResume之后才开始拿到这值的, 使用  onLayout()方法得到的结果,会在第一次输出,当然这个函数会执行很多次,例如后面的又输出来一次, 其中subview输出的是将...Width 也是在onResume之后输出的, 也就是说:我们想拿到宽和高,都是在onResume这个周期之后才可以拿的到的, 其实也就是在layout之后才拿到的 关于该代码的工程包等我下次更新的时候上传...在setContentView()被调用后,事件队列中会包含一个要求重新layout的message,所以任何你post到队列中的东西都会在Layout发生变化后执行。...onLayout方法会调用很多次,所以要考虑好在这个方法中要做什么,或者在第一次执行后禁用掉你的代码。

    1.5K20

    金九银十Android面试复习题集:关于四大组件中的Activity你了解多少?

    onDestroy() 这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。...Activity 在 onResume 之后才显示的原因是什么? 虽然我们设置 Activity 的布局一般都是在 onCreate 方法里调用 setContentView 。...) 综上,在onResume回调之后,会创建一个 ViewRootImpl ,有了它之后应用端就可以和 WMS 进行双向调用了。...只不过死循环阻塞了主线程,如果系统再有上述的四种事件发生,就无法在相应的时间内处理从而触发 ANR。 onNewIntent是什么时候调用的?...以上内容均放在了开源项目:【github】 中已收录,里面包含不同方向的自学Android路线、面试题集合/面经、及系列技术文章等,资源持续更新中...

    1.5K00

    面试?看完这篇就够了-深入分析从点击应用图标到应用界面展示

    不过如果我们在代码中手动调用 View.requestLayout,最终也会走到这里,此时的当前线程就是调用线程,所以这也解释了为什么我们不能在非主线程更新 UI。一定不能在非主线程更新 UI 吗?...在 fork() 之后,父进程和子进程将并发执行相同的代码。这意味着 fork() 系统调用在父进程和子进程中都会执行。fork() 的返回值规则是为了让父进程和子进程能够区分自己的角色。...在父进程中,fork() 返回新创建子进程的进程 ID(PID);在子进程中,fork() 返回 0。...在 Android 系统中,Zygote 进程充当了应用程序进程的孵化器(incubator)。...创建之后,只需要保证创建 ViewRootImpl 的线程和更新 UI 的线程是同一个就可以;比如我们在子线程调用 ViewManager#addView我们同上说子线程不可以更新 UI,这个异常是在

    31530

    Android面试题集:以前烂大街的四大组件-Activity,面试重提这些知识点你还记得吗?

    onDestroy() 这个方法在Activity被销毁之前调用,之后Activity的状态将变为销毁状态。...Activity 在 onResume 之后才显示的原因是什么? 虽然我们设置 Activity 的布局一般都是在 onCreate 方法里调用 setContentView 。...WMS 通过 mWindow (一个 Binder 对象) 调用应用端 mWindowSession.addToDisplay(mWindow) 综上,在onResume回调之后,会创建一个 ViewRootImpl...只不过死循环阻塞了主线程,如果系统再有上述的四种事件发生,就无法在相应的时间内处理从而触发 ANR。 onNewIntent是什么时候调用的?...)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息; 7、主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法

    77000

    Android 手机从开机到 APP 启动经过的流程

    ,是IPC中的一种;(但是在Android中一般使用Binder来实现IPC,这里使用socket的原因后面有写到) SS:Framework两大重要进程之一(另一个是Zygote),载着framework...当开启App之后,会调用main()开始运行,开启消息循环队列,这就是传说中的UI线程或者叫主线程。...从Activity创建成功到显示画面 onCreate()方法中先执行setContentView()方法将对应的xml文件传入,之后会去调用window.setContentView(),最终会在这里创建...开始onResume()阶段,在开始会向H类发送一个消息,然后在ActivityThread中获取之前创建的Decorview并调用windowManager.add(),最后在windowManager...先利用MeasureSpec完成onmeasure(),然后在onlayout()中确定各元素的坐标,ondraw()负责将view画到canvas上,再通过Surface进行跨进程最终调用Native

    1.9K51

    Window源码解析(一):与DecorView的那些事

    Window 第一次出现在 Activity 的视野中,是在 Activity 的 attach 方法中,具体代码如下: final void attach(Context context, ActivityThread...之后设置了回调,这样当 Window 接收到触摸或者按键等事件后,会回调给 Activity 。 另外还给 Window 对象设置了窗口管理器,也就是我们经常用到的 WindowManager 。...与DecorView的那些事 在开头中说到,Window 是用来负责管理 View 的。 现在 Window 已经创建完毕了,那么到底什么时候与 View 发生了交集了呢?...我们总结一下,在 setContentView(int layoutResID) 中主要就是这三件事: 创建 DecorView 视图对象; 将自定义的视图 layout_main.xml 进行解析并添加到...installDecor() 中,调用了 generateDecor() 方法来创建 DecorView; 之后又调用 generateLayout(mDecor) 来创建 mContentParent

    55320

    Android面试高级:内存泄露,OOM,ANR ,Devik 进程,Framework原理,Activity 生成一个 view,Android 中的动画,SurfaceView和View的

    1)Activity在attch方法的时候,会创建一个phonewindow(window的子类) 2)onCreate中的setContentView方法,会创建DecorView 3)DecorView...Android中就是这样的,Android的主线程就是这样的,在一个whlie循环里打转转。怎样打转转的呢?...主线程的run()里只要调用Looper.loop(),就一直在这个loop()方法里走不出来了,一直在while循环里。...由setContentView这个方法我们可以明显看出这里我们是调用基类的Activity的setContentView(),而Activity这个基类是框架定义的(参见上篇Acticity是EIT中的...SurfaceView是在一个新起的单独线程中可以重新绘制画面,而View必须在UI的主线程中更新画面在UI的主线程中更新动画,时间一旦太长就会出现问题 SurfaceView在新的线程中更新画面所以不会阻塞你的

    9210

    《Activity显示界面历险记》

    前言 在Activity显示View的过程中,有一些重要的角色总让人理不清,比如PhoneWindow、DecorView、ViewRootImpl。 也常常有面试题会问到,他们四者之间的关系?...加载布局文件(DecorView) 有了窗管家之后,就可以继续onCreate方法了,在onCreate方法中最重要的就是这个setContentView方法。...再回到上面的setContentView方法中,在调用installDecor方法创建了小弟之后,还做了一件事: //加载xml布局文件 mLayoutInflater.inflate(layoutResID...小薇是什么时候创建的呢? 接着看Activity的调用过程,在onCreate调用完后,就会调用onResume方法,这又要从handleResumeActivity方法说起了。...ViewRootImpl,创建于handleResumeActivity方法中,最后通过addView被创建。 View的第一次绘制发生在什么时候?

    49720

    面试官灵魂发问:你真的懂 Context 吗?

    面试官:ContextImpl 实例是什么时候生成的,在 Activity 的 onCreate 里能拿到这个实例吗 :这个都是系统处理的,具体时机没有跟进去看。...面试官:好的,回去等通知吧 ️ 坚持每天学习、不断的提升自己,目前月薪 30k 面试官:ContextImpl 实例是什么时候生成的,在 Activity 的 onCreate 里能拿到这个实例吗 ️:...( contextImpl , application) 这个方法就把 Activity 和 Application 以及 ContextImpl 关联起来了,就是上面结论里说的时机一样 最后调用 activity.onCreate...得出结论,ContentProvider 的 Context 是在 Applicaiton 创建之后,但是 onCreate 方法调用之前初始化的 【Android进阶学习视频】、【全套Android...动态注册很简单,在调用 Context.registerReceiver 动态注册 BroadcastReceiver 时,会生成一个 ReceiverDispatcher 会持有这个 Context

    1.6K11

    线程与更新UI,细谈原理

    进入正题,大家应该都听过这样一句话——“UI更新要在主线程,子线程更新UI会崩溃”。久而久之就感觉这是个真理,甚至被认为是“官方结论”。 但是如果问你,官方什么时候在哪里说过这句话,你会不会有点懵。...2)onResume方法之后,会新建一个ViewRootImpl,作为DecorView的parent对DecorView进行测量,布局和绘制等操作。...ViewRootImpl的创建是在onResume之后。...setText方法中调用了TextView的setText()方法,然后由于Toast中的TextView宽高都是wrap_content的,所以会触发requestLayout方法,最后会调用到最上层...所以崩溃的原因就是因为Toast在第一次在子线程中show的时候,新建了一个ViewRootImpl实例,绑定了当前线程也就是子线程到mThread变量。

    85320

    你的 APP 为何启动那么慢?

    App启动方式 ---- 冷启动(Cold start) 冷启动是指APP在手机启动后第一次运行,或者APP进程被kill掉后在再次启动。...调用startActivity,该方法经过层层调用,最终会调用ActivityStackSupervisor.java中的startSpecificActivityLocked,当activity所属进程还没启动的情况下...此时,系统进程会交换应用程序的启动窗口,允许用户开始与应用程序进行交互。如果应用程序中重载了Application.onCreate(),系统会调用onCreate()方法。...当用户点击你的app那一刻到系统调用Activity.onCreate()之间的这个时间段内,WindowManager会先加载app主题样式中的windowBackground做为app的预览元素,然后再真正去加载...解决方案 1.甩锅给系统 使用透明主题: android:windowIsTranslucent">true Activity.onCreate()之前App不做显示

    1.9K20

    Android之View的诞生之谜

    Activity的布局文件是如何被加载的? 我们的activity中的视图是什么时候被加载的呢?...我们接着看 getWindow().setContentView(layoutResID); 在渲染我们的布局文件前,先调用了installDecor()来初始化mContentParent,之前也说mContentParent...其实要想知道什么时候开始执行测量等工作,我们可以看下ActivityThread的源码,ActivityThread是android用来管理activity的,这家伙知道的肯定多一些。...首先ActivityThread通过调用handleLaunchActivity启动我们的目标activity 也就是说在performLaunchActivity调用之后,activity的onCreate...作为绘制view的入口,我们来看下requestLayout方法 ViewRootImpl.scheduleTraversals()调用后,系统会发起一个异步消息,然后在异步消息执行过程中调用performTraversals

    40330
    领券