布局优化之异步Inflate实战

241 篇文章 5 订阅

1、

2、

布局文件加载慢有两点,第一点是布局文件读取过程非常慢,因为它是一个io的过程。第二点是创建view的过程比较慢,因为它是通过反射来创建的。这个布局文件可能非常大,也就是说里面嵌套层级会比较多,这样反射就更多,

3、

从根本上解决:比如说,反射慢,那就不使用反射,那么反射慢直接就解决了。比如io慢,那就去掉io过程,那就没有io性能的这个问题了。

侧面缓解:不影响主线程,让在主线程上不耗时。

4、

AsyncLayoutInflater:

 

5、

6、

在构造函数中主要做了三件事情,

创建一个infalter,

创建一个handler,这个handler就是用于回调主线程的时候使用的,这个handler需不需要绑定主线程的MainLooper呢?进行显式的绑定?这里其实不需要进行显式地绑定,因为AsyncLayoutInflater创建它的时候一定是在主线程。

创建一个InflaterThread,

 

 

 

InflateThread继承自Thread。这就是说它里面进行了一个线程的操作。

 

然后AsyncLayoutInflater中调用了inflate()方法,该方法对传入的三个参数进行了包装,包装成了一个InflateRequest对象,并且把该对象加入到了线程的队列中去

 

7、

在run()方法不停地进行循环

 

在runInner()中取出一条前面所封装好的request。也就是说infalte()方法发生在子线程当中。

 

然后通过handler将它回调到主线程当中

 

在callback中的handleMessage()方法中,先判断一下view是否加载完成,如果没有加载完成,会回退到主线程进行布局文件的加载。紧接着会将该view回调给主线程的onInflateFinished()方法,这样在主线程就可以进行setContentView()这样的操作。

 

 

8、

高版本向下兼容是通过使用AppCompat来进行的。在AsyncLayoutInflater()中的BaseInflater()中并没有进行相关的操作。

所以,如果使用AsynLayoutcInflater就失去了向下兼容的效果。这是使用系统原生的AsynLayoutInflater它的问题。这个问题也是可以解决的,那就是自定义AsyncLayoutInflater,

 

但是该类是final的,所以系统并不希望我们复写,所以说如果自己写的话,需要完整地写这个类。然后在BasicInflater创建的时候,就将在Activity中绑定的LayoutInflater拿过来。

 

9、

AsyncLayoutInflater是从侧面缓解了界面的卡顿,但是,它不能设置LayoutInflater.Factory,这样的话就必须对AsyncLayoutInflater进行自定义。但是这个类是final的,所以必须拷贝出一份进行更改。

AsyncLayoutInflater对布局的加载发生在异步线程,所以在加载过程中不能有依赖于主线程的操作。

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值