UI绘制流程及原理

带着如下几个问题去听课

  1. ActivityThread起到的是什么作用?
  2. Activty的生命周期oncreate 和onResume 在ui绘制流程中做了哪些事情?
  3. View是如何添加到window上面?
  4. 为什么View的更新不能在子线程?

ActivityThread起到的是什么作用

ActivtityThread是activity里面的各个生命周期方法的执行入口。里面都是通过Handler去实现的。

Activty的生命周期oncreate 和onResume 在ui绘制流程中做了哪些事情?

onCreate只是把View添加到window上面,并没有开始测量,布局。测量和布局是在onresume执行的。
具体的源码可以从ActivityThread的performLaunchActivity。 这里面会通过调用WindowManager.addView(decorView, params),然后通过windowManager可以一层层的追溯到ViewRootImpl。 viewRootImpl通过调用setView方法后会执行到requestlayout方法。 requestLayout方法在往后就通过编舞者,来调用performMeasure, performLayout, perormDraw,从而达到测量,布局,绘制的目的。

View是如何添加到window上面

Activity.setContentView ------> Window.setContentView(window是一个抽你类,只有唯一的一个实例PhoneWindow)

最后就调用到了PhoneWindow.setContentView

installDecorView(创建顶层view为FrameLayout子类DecorView) ------> 根据不同的主题加载相应的布局添加到顶层View上面 ------> 由于每个布局上面必定有id为android.R.id.content控件,因此setContentView的布局最后是添加到了android.R.id.content的Frame上面的。

为什么View的更新不能在子线程?

那是因为在ViewRootImpl调用 setView方法后, 里面有一个checkThread方法, 判断了当前线程是否为主线程。 如果不是主线程,则抛出异常。因为ui更新必须在主线程里面才能完成。

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

推荐阅读更多精彩内容