View的绘制流程重新整理

在讲本流程前默认你已经懂了Activity的启动流程
接Activity的启动流程 在AMS binder驱动返向 transact 后


image.png

在 ApplicationThreadNative(应用进程)Binder收到回调onTransact


image.png

调用 ApplicationThread的scheduleLaunchActivity
image.png

image.png

image.png

Ui线程Handler处理消息


image.png

android.app.ActivityThread#handleLaunchActivity
image.png

Activity a = performLaunchActivity(r, customIntent); 有兴趣的可以点击这个方法看看,这里是借助 Instrumentation的协调产出了一个Activity 并且调用了Activity的 attach方法
在Activity中的 attach方法中做了一些绘制的准备工作
1、PhoneWindow的创建
2、并给PhonwWindow设置了windowManager
然后绘制流程开始的函数handleResumeActivity出现了
image.png
image.png

ViewManger或者说WindowManger的实现类是 WindowManagerImpl 进入到它的


image.png

因为前面在 ActivityThread中 WindowManagerGlobal已经初使化好了所以上面可以直接调用了
下面调用了ViewRootImpl的 setLayoutParams


image.png

image.png
image.png

image.png

image.png

image.png

image.png

image.png

image.png

image.png

所以你说View绘制的顺序是measure、layout、draw是没有问题的。
还有个问题就是在ViewRootImpl setLayoutParams的时候 调用了一下
image.png

这里有checkThread()
image.png

为什么在Activity的onCreate中开启一个子线程给一个TextView设置文本不会崩溃
image.png

如果延迟个1秒就崩溃了呢?
这是因为如果以极快的速度在onCreate里子线程更新ui时View还没有开始绘制流程不存在checkThread()

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容