前提:界面绘制是一个IO过程,将资源映射到内存中,同时也是通过反射进行操作,这就导致速度变慢,如果布局不得当存在重绘或者层级过多,也会导致绘制变慢,因为绘制是一个自上而下的过程,层级太多那么时间就会变长。
优化方式:
1、使用AsyncLayoutInflater 异步加载,但是注意这个方式有些限制问题,比如:不能设置LayoutInflater.Factory,高低版本兼容,不能进行主线程操作等,在我们实际使用过程中需要对这个类进行自定义。
大致操作逻辑是:AsyncLayoutInflater 加载完毕后回调一个view给主线程,主线程再去使用这个view,这样提高了响应速度。
使用方式非常简单:
new AsyncLayoutInflater(MainActivity.this)
.inflate(R.layout.main_layout, null, new AsyncLayoutInflater.OnInflateFinishedListener() {
@Override
public void onInflateFinished(View view, int resid, ViewGroup parent) {
setContentView(view);
}
});
这个类代码比较少,但是他是一个final类,所以定制时需要将它复制出来后再进行修改即可,它的源码分析请谷歌百度。
2、X2C库,在APT编译期将xml转成java代码执行,通过注解的方式进行操作。关于这个控件需要注意的是xml个别标签它是不支持的,也要注意高低版本系统兼容,可通过修改代码进行完善。
git地址:https://github.com/iReaderAndroid/X2C/blob/master/README_CN.md
系统控件版本高低兼容,以TextView为例,可以修改源码中的tv为AppCompatTextView.
3、层级过多和重绘
在xml中去减少层级可使用ConstraintLayout 进行约束
重绘可开启GPU工具,查看非蓝色部分,就是需要改进的地方。