大多数Android开发都是通过xml文件编辑Android页面布局的,而最终通过activity的setContentView()方法绑定.下面来走一下源码的流程
@Override
public void setContentView(@LayoutRes int layoutResID) {
getDelegate().setContentView(layoutResID);
}
往下走
![](https://img.haomeiwen.com/i9839933/39736f891acaba51.png)
发现是一个抽象方法,点击左边的绿色圆点和向下箭头,可以调转到具体的实现
![](https://img.haomeiwen.com/i9839933/2b323666013d92de.png)
发现了熟悉的LayoutInflater,继续查看inflate方法
![](https://img.haomeiwen.com/i9839933/801960baf56ab552.png)
继续走
![](https://img.haomeiwen.com/i9839933/1bcce54ebcd008eb.png)
这里出现了XmlResourceParser对象,估计是解析xml用的,继续走inflate方法
![](https://img.haomeiwen.com/i9839933/8264761ac32a5102.png)
在这里发现了createViewFromTag()这个函数,注释还说明了返回的view就是xml里找到的view,跟进去看看
![](https://img.haomeiwen.com/i9839933/c6888fb4e0f167bd.png)
继续走
![](https://img.haomeiwen.com/i9839933/937de74b2c181022.png)
在这里看到,首先回去尝试创建View tryCreateView(),在view为null的情况下,又去createView().先看看try里面做了什么
![](https://img.haomeiwen.com/i9839933/2c46805f864441fb.png)
这里发现了mFactory2和mFactory,有什么作用?先不管,下面的mPrivateFactory跟了源码发现是解析fragment标签用的
再去看看第二个createView
![](https://img.haomeiwen.com/i9839933/8e4a99041f7c3d3e.png)
这个方法的代码有点多,能引起我的注意的Class.forName()和紧跟着的代码,是不就是反射么?接着看代码
![](https://img.haomeiwen.com/i9839933/22e0ecc08e035d0d.png)
看到view=constructor.newInstance();并return算是走完了流程.
回顾流程,简单总结步骤,setContentView调用首先走到LayoutInflater.inflate(),通过XmlResourceParser去解析xml文件,获取到对应的布局后调用createViewFromTag(),显示判断是否设置了factory2和factory,没有的话就调用createView通过反射的方式创建View并返回.
整个流程其实可以简单的分为2个步骤,第一是解析xml文件,这是一个IO读取的过程.另外一个是发射,一般反射创建对象要比直接new一个对象慢2,3倍,所以布局优化可以从这2个方面着手.
网友评论