Android布局加载原理

241 篇文章 5 订阅

1、

2、

3、

 

点击跳转到它的父类AppCompatActivity里面只有一个实现

在AppCompatDelegate中看到它是一个抽象的方法,它的父类其实对它并没有进行实现

 

查看inflate()的方法

 

这个inflate()方法同时也调用了另一个inflate()方法

 

在这个方法中调用了getLayout()这个方法

 

 

 

该方法调用xml解析布局的方法

 

 

解析xml布局文件,返回一个解析好的XmlResourceParser对象

我们真正写的是一个xml文件,在操作过程中将它读取到内存当中,这个过程其实就是一个io过程。这里是一个瓶颈点,因为平常开发过程中,io操作是发生在工作线程的。

 

 

 

回到前面的inflate()方法

加载完布局得到XmlResourceParser对象之后,通过inflate()进行布局的加载

 

在View inflate()该方法中通过传入的参数返回的view对象

 

View inflate()该方法中有对merge标签的处理

 

View inflate()里面还有一个方法是createViewFromTag(),是根据一个tag创建出一个view

 

该方法中又调用了不同参数的方法

 

该方法其实就是对布局文件创建view的一个过程

 

在该方法中首先判断mFactory2是否为null,如果不为null的话通过Factory2进行view的创建。如果Factory2为空,会再判断factory是否为空,不为空的话通过Factory进行创建。也就是优先使用Factory2进行view的创建。

下面mPrivateFactory只用于fragment标签的加载

 

如果view为空的话,会进行onCreateView()或createView()方法

 

在crateView()方法中

 

这里面会调用一个clazz.getConstructor()通过反射获取构造方法,并通过暴力反射,将其设置为可访问,并存入hasmap集合中

 

 

然后通过反射创建一个view,并返回。

就是说如果没有创建Factory2,也没有设置Factory的话,最终会在这里进行view的创建。这里使用了反射,使用反射的过程中,很有可能导致程序变慢。这个地方也有可能是一个瓶颈点。

4、

在开发过程中,都是调用setContentView()这样一个方法,它会使用LayoutInflater的inflate()方法。该方法首先会调用inflate()的操作,也就是将布局文件加载到内存里面,这其实是一个io操作。接着调用createViewFromTag()方法,对xml的tag进行一个读取,比如现在已经知道它是一个textview了,然后可以通过具体的tag创建具体的view。该方法中首先会调用factory2或者factory进行方法的创建,如果这两个factory都没为null的话,会调用createView()进行view的创建,该方法是通过反射进行创建的。

5、

对于布局文件的解析是一个io的过程,如果布局文件特别特别大,那么将该布局文件读到内存中是耗性能的,也就是可能导致卡顿。第二点,创建view的过程是一个反射的过程,如果反射使用过多,就是布局文件中标签非常多,就是反射会使用很多次,反射本身就慢,如果使用过多,会导致更慢。所以,setContentView()过程中,这两点是它的性能瓶颈点。

6、

在创建view的过程中,优先采用两点来进行创建,一个是factory2,一个是factory。

LayoutInflater.Factory其实是LayoutInflater创建view时的一个hook(一个挂钩,就是可以将自己的代码挂在它的原始代码之上),可以对它的流程进行一些更改。

7、

 

 

里面只有一个方法onCreateView()

name:要加载的一个tag,比如一个TextView,通过这个方法后抛出的就是这个TextView.

 

Factory2也只有一个方法,但是该方法比Factory多了一个参数,它多了一个parent

parent:用于盛放所创建的view。就是创建view的parent,也返回来了

就是说Factory2比factory功能更强大一些

 

 

9、

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值