面试当中一定会问的问题,你在项目当中做了哪写优化?本章着重介绍我们在开发当中对布局方面做的一些优化项。
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
禁止加载图片,在初始化之后在进行图片加载。
文章主要介绍在面试中我们需要怎么回答,不做过深的探索,有兴趣的同学可以自行研究一下。
网友评论