前语

迎面走来的一位中年男子,他一手拿着保温杯,一手抱着笔记本电脑,顶着惺忪的睡眼,不紧不慢地走着,不多的几根头发在他头顶自在飞翔。过了一会,他面对着我坐下,放下电脑和保温杯,边揉眉头边对我说

“来面试的?”

“对对对” 我匆促容许

“行吧android的drawable类,那你讲讲 View 的制作流程吧”

【面试官爸爸】来给我讲讲View制作?

起一个好头

View 的制作流程应该是每个初高档 Android 攻城狮必知必会的东西,也是面试必考的内容,每个人都有不同的答复方式。

简略点比方 measure,layout,draw 分别对应丈量,布局,制作三个进程,高超一点的会引申出 H算法的时刻复杂度是指什么andler,同步屏障,View 的作业传递,乃至 activity 的发起进程。把握哪些东西,怎样答复,能够给面试官一种明晰,了Android然于胸的感觉,一同又不会被追问三连一问三不知。各位老爷听我渐渐道来。

“噢噢,View 的制作啊。这个能够分为尖端 View 的制作,Viewgroup 的制作和 View 的制作三个方面。尖端 View 便是 V接口卡iewrootImpl”

将答复的算法内容分类是表现自己考虑才能和常识线程和进程的区别是什么结构的重要表现。

什么是 ViewRootImpl

比较 Viewgroup 和 View,ViewRootImpl 或源码编辑器编程猫许更为陌生,实践开发中咱们根柢用不到它。那么

什么是 Vieandroid下载装置wRootImpl 呢?

从结构上来看,ViewRootImpl 和算法的时刻复杂度是指什么 ViewGroup 其实是一种东西android下载

【面试官爸爸】来给我讲讲View制作?

它们都继承了 ViewParent。ViewParent 是一个接口,界说了一些父 Vi源码网站ew 的根柢行为,比方 requestlayout,getparent 等。Android不同的是,Vi算法剖析的意图是ewRootI接口mpl 并不会像 ViewGroup 相同被真实制作在屏幕上。在 ac源码编辑器tivity 中,它是专门用来制作 DecorVi线程池面试题ew 的,中心方线程法是 setView

答复的好好的偏要问我其他问题

说到 DecorVie线程池的七个参数w,就不得不说一下 window 了。面试中常常咱们说到一个点,或许一个词,面试官会马上引申出这个常识点相关的问题。假定咱们仅仅算法剖析的意图是死记硬背,自顾自背一堆制作相关的东西而答复不上来,会大源码之家大减分。所以贮藏与必问内容相关的东西对面试和自己的常识体系很有帮忙。不少源码年代老爷被面试的时分都会被问到一个问题

“a接口是什么ctivity,window源码,View 三者之间的联络是什么?”

咱们能够经过一张图来阐明。

【面试官爸爸】来给我讲讲View制作?

如图所示,w线程和进程的区别是什么indow 是 activity 里的一个实例变量,实质源码本钱是一个接口,唯一的完毕类是 PhoneWindow。

activity 的 setContentView 办法实践上是便是交给 phonewindow 去做的。windandroidstudio装置教程ow 和 View 的联络能够类比为闪现器线程的概念闪现的内容

每个 activity 都有一个“闪现器” window,“闪现的内容”便是 DecorView。这个“闪现器”界说了一些办法来决议怎样闪现内容。比方 setTitleColor setTitle 是设置导航栏的颜算法工程师学什么专业色和线程池面试题 title , setAllowReturnTransitionOverlap 设置进/出场动画等等。

所以 window 是 activity 的一个成员变量,window 和 View 是“闪现器”和“闪现内容”的联络。

这便是他们的联络

View 是怎样制作的

“呦呵,不错嘛,这个比方不错,看来平常还挺爱考虑的。行,你继续说说 View 是怎样制作的”

在整个 activity 的android下载生命周期中,setContentView 是在 onCreate 中调用的,它完毕了对资源文件的解析,完毕了 xml 文件到 View 的转化。那么 View 真实开始制作是在哪个生命周期呢?

答案是 onResume 完毕后

他们的联络在源码中一目了线程和进程的区别是什么然。

【面试官爸爸】来给我讲讲View制作?

从源码中能够看到,onResume 之后,ActivityThread 经过调用 activity 中 windandroid平板电脑价格owmanager 的 addView 办法,将 decorView 传入到 ViewRootImpl 的 setView 办法中,通源码之家过 setView 来完毕 View 的制作。

问题又来了,算法的有穷性是指setView 到底有什么魔法,为什么他就能完毕 View 的制作作业呢?

ViewRootImpl 是线程撕裂者怎样制作 View 的

咱们再来看一下 setView 办法

【面试官爸爸】来给我讲讲View制作?

线程的几种状况略来说 setView 做了三件事

① 查看制作的线程是不是创建 View 的线程。这儿能够引申出一个问题,View 的制作必须在主线程吗?

② 经过内存屏障确保制作 View 的使命是最优源码之家先的

③ 调用 performTraversals 完毕 meas算法的时刻复杂度是指什么ure,接口自动化layout,draw 的制作

看到这儿,ViewRootImpl 的制作根柢就完毕了。其实这也是面源码买卖网站源码试官希望听到的内容。查询的是面试者对 View 制作体系的了解。

后续 ViewGroup 和 View 的制作其实是 pe源码是什么意思r源码年代培训怎么样formTraversals 对整个 ViewTree 的制作。他们的联络能够用下面这张图标明

【面试官爸爸】来给我讲讲View制作?

考考你对常识的运用

“不错不错,看来你对 Viewrootimpl 的制作进程把握的不错嘛,你方才说到 View 的制作是在 onResume 之后才开始的,那为什么我在 onCreate 中调用 View.post接口英文 办法能够得到 View 的宽高呢”

这个问题乍看挺唬人的。其实看一眼源码大约就了解了

【面试官爸爸】来给我讲讲View制作?

View.post 会判别当时 View 是否现已被添加到 window 上。假定添加了则立即实施 runnable,假定没有被添加则先放到一个队伍中存储起来,等添加到 window接口的效果 上时再实施。

而 View 被丈量完毕后才会 attachToWindow。所以当 post 的 runnable 实施时,View 现已制作完毕了。

MeasureSpec 的了解

“可源码本钱以能够。看来这个小细节你留意到了。再问你个简略的问题,你方才说到 measure 办法吧,那你说说什么是 MeasureSpec?为什么丈量宽高要用它作为参数呢?”

这个问题看似很简略呆板,其实是想查询对 View 丈量的了解。

View 的巨细不仅仅取决于自身的宽高,还取决于父 View 的巨细和丈量方式。一个 200200 的父 View 是不或许包容一个 300300 的子 View 的,父 View 的 wrap_conten算法的有穷性是指t 和 match_content 也会影响子 Vandroid平板电脑价格iew 的巨细。

所以 View 的 measure 函数其实应该有 4 个参数:父 View 的宽父 View 的高宽的丈量方式高的丈量方式

Android 这儿用了一个巧妙的设计,用一个 Int 值来标明宽/高的测接口文档量方式和巨细。一个 int 有 32 位,前 2 位标明源码丈量 MODE,后 30 位标明 SIZE。

为什么要用 2 位标明 MODE 呢?因为 MODE 只需 3 种呀,UNSPECIFIED,源码编程器EXACTLY,AT_MOST,小傻瓜。

【面试官爸爸】来给我讲讲View制作?

“不错啊小android是什么手机牌子伙子,那我自界说一个 View 的时分,假定不对 MeasureSpec 做处理。运用这个 View 时宽高传入 wrap_content,效果会怎样样?”算法工程师学什么专业

这个查询的便是 View 制作的实践运用了。当咱们自界说一个 View 时,假定继承的是 View,measure 办法走的便是 View 默许的逻辑

【面试官爸爸】来给我讲讲View制作?

所以源码网站当咱们自界说 View 时,假定没有对android体系 MODE 做处理,android平板电脑价格设置 wrap_content 和 match_content 效果其实是相同的,View 的源码编辑器编程猫宽高都是取父 View 的宽高。

再来点细节

“呦呵,那你说说 invaliate 和 requestlayout 办法的差异”

前面咱们说到,ViewRootImpl 作为尖端 View 担任 View 的制作。所以简略来说,requestlayout 和 invaliate 毕竟都会向上回溯调用到 ViewRootImpl 的 postTranversals 办法来制作 View。

不同的是 requestlayout 会制作 View 的 measure,layout 和 draw 进程。invalAndroidiate 因为只添加了制作 draw 的标志位,只会制作 draw 进程。android下载装置

这也能考算法

“能够能够,看来 View 制作这块你了解的不错嘛。来考你个小算法,完毕一下 findViewbyid 的进程”

一般对开发而言,算法的查询都不会太深,首要线程的概念是常见算法的简略运用。意图是对事务中遇到的一些问题有更好的解决思路。像这个问算法是什么题其实是想查询一下递归算法的简略运用。

【面试官爸爸】来给我讲讲View制作?

“小伙子预备的不错嘛,好了,View 制作这块我没有什么问接口题了,咱们来聊聊 View 作业处理吧….”

View 制作相关的问题源码编辑器编程猫到这儿就完毕啦。假定咱们觉得还不错的话,欢迎各位点赞,保藏,注重三连~

后续我还会继续更新【面试官爸爸】这个系列,包含作业处理android下载装置HandlerA算法工程师ctivity 发起流程编译打包优化Context 等面试最常问的问题。假定不想失掉,欢迎点赞,保藏,注重我!

线程的概念能够注重我的群众号 @方木Rudy 里面不仅有技术,还有故事和感悟。你的支撑,是我不断创算法工程师作的动力!

哦对了,是不是看接口crc过错计数完一遍觉得不行爽?杂七杂八说一大堆温习的时分一点也不轻松! 嘿嘿,我把上面说到的所有问题收拾成了思维导图,便当各android是什么手机牌子位观众老接口爷温习 ~

【面试官爸爸】来给我讲讲View制作?

我是方木

一个在互联网国际挣源码编辑器编程猫扎向上的打工人

竭力日子,竭力向前

欢迎来群众号找我玩~ @方木Rudy