面试当中一定会问的问题,你在项目当中做了哪写优化?本章着重介绍我们在开发当中对布局方面做的一些优化项。
Android系统的屏幕存在着怎样的刷新机制?
既然提到布局的优化,首先我就要了解Android系统是怎么刷新屏幕的显示,我们都知道如果我们想要屏幕流畅的运行,那么我们就要保证UI全部的测量(Measure),布局(Layout),绘制(draw)全部的耗时在16ms内。那么为什么是16ms呢?
这是因为人眼与大脑的协作无法感知超过每秒60帧的画面更新,用1000除以60得到一个大约的时间就是16ms。
在布局方面我们应该遵守哪些优先原则?
-
FrameLayout优先选择 -
RelativeLayout的选择优先性取决于布局是否复杂,RelativeLayout可以较简单的实现LinearLayout需要嵌套才可以实现的布局。 - 当
RelativeLayout和LinearLayout可以同时满足需求时,我们优先选择LinearLayout,因为RelativeLayout实现较为复杂,会出现重复测量的情况。通过日志打印可以看到RelativeLayout经常会出现对子View进行两次的测量来确保子View被放在正确的位置上。当然如果LinearLayout添加了weight属性的话,也会对子View进行两次测量,这里需要注意的是,如果出现多层嵌套的话,测量的次数会成指数增长。
布局当中要避免Overdraw
什么是Overdraw?
-
Overdraw是指屏幕上的某一个像素点在同一帧的时间绘制了多次。
我们可以通过开发者模式中打开过度绘制的开关看到屏幕的绘制情况,通常情况下我们通过四种颜色来展示不同程度的Overdraw情况。 - 蓝 1xOverdraw
- 绿 2xOverdraw
- 红 3xOverdraw
- 暗红 4xOverdraw
当我们程序中出现大范围的红或者暗红的时候我们就需要对我们的布局进行优化。
能通过ConstaintLayout完成的布局尽可能用此布局
ConstaintLayout属于Android Studio 2.2的新特性,它可以有效地解决布局嵌套过多的问题。
布局优化中各种标签的使用
Android中为我们提供了三种布局的标签可以使用,分别为include,merge以及ViewStub。
include
在一个布局中引入另一个布局。如果多个页面中有相同的布局,这样可以将相同的部分提取出来,供各个layout使用,提高代码的复用性。这里需要注意的是include标签中可以覆盖引入的layout的跟布局的属性,比如宽高的定义等。
merge
merge标签的作用主要是减少布局的嵌套层次,优化布局层级,提高布局的加载效率。他可以看作是include标签的辅助以及拓展,比如我们的布局跟布局是一个LinearLayout,include的布局文件中也是一个LinearLayout,且两个布局都是垂直布局,这是我们就可以将include布局文件中的跟布局改为merge,这样就减少了LinearLayout的层级嵌套,引入的方式就可以改为merge。
ViewStub
ViewStub只有在加载该布局的时候才会占用资源,不可见的状态下不会对其进行绘制。
一些原生View的优化
最常问的就是ListView的优化
- 复用convertView,重复使用回收的view
- 使用viewholder
- 分页加载数据
webview的优化
- 全局
webview提前启动,减少webview首次启动的耗时 - 代理数据请求 通过native去向网络请求数据,
webview初始化之后从native去要数据。 - 优化加载速度 设置
webview禁止加载图片,在初始化之后在进行图片加载。
文章主要介绍在面试中我们需要怎么回答,不做过深的探索,有兴趣的同学可以自行研究一下。