1 布局优化
1 16ms的由来
画面的帧数在40~60之间的时候,人眼看起来是流畅的。在安卓系统里,系统通过VSYNC信号触发对UI的渲染、重绘,比较合适的时间就是16ms。其意思就是1000ms里面显示60帧。一旦时间大于该值。就会导致丢帧、卡帧,就是所谓的看起来很卡的现象。
在真机测试的时候可以在“开发者选项”里面选择“Profile GPU Rendering”显示柱状图。其中,蓝色代表测量绘制Diaplay List的时间,红色代表OpenGL渲染Display List的时间,绿线就是16ms,尽量让所有的条形图在其下方。
2 Overdraw
同样是在“开发者选项”里面选择“GPU 过度绘制”,可以看到界面会呈现不同的颜色。从最优到最差依次为蓝、绿、淡红和红,同理也是要尽量避免红色的出现。
3 优化布局结构
我们都知道在系统对View进行测量绘制的时候是采用对View树遍历进行的。如果View层级过多就会导致测量和绘制过慢,Google的API建议View树的层级不要超过10层。
4 include复用布局文件
需要注意的是不要在通用的布局文件里编写过多只有某界面需要的特殊属性。
<include
layout="@layout/activity_main"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
5 ViewStub的一次性延迟加载
先看下代码:
public class MainActivity extends AppCompatActivity {
private Button mButton;
private ViewStub mViewStub;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
}
private void initView() {
mViewStub= (ViewStub) findViewById(R.id.main_viewstub);
mButton= (Button) findViewById(R.id.main_btn_show);
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(null!=mViewStub){
View inflateView=mViewStub.inflate();
mViewStub=null;
}
}
});
}
}
现在来说下几个需要注意的点:
1. 使用ViewStub可以通过findViewById获取得到;
2. 让其显示出来有2种方法:一是通过setVisibility(View.VISIBLE);而是通过其inflate()方法显示这个View。后者还可以通过findViewById获取其内部的控件进行操作处理;
3. ViewStub只能一次性使用,显示后就不存在了,所以上述代码在其显示后置不聊了,同时加了判断,否则点击按钮会报错。
2 内存优化
1 Bitmap的优化
主要方向有3个:
1. 使用适当分辨率和大小的图片;
2. 及时回收!!
3. 图片缓存机制
可以看之前下过的一篇Blog:http://blog.youkuaiyun.com/cherish20151011/article/details/51387414
2 代码优化
这个就需要关注日常编码的一下小细节。现列举如下几个作为参考:
1. 常量使用Static关键字;
2. 尽量不要使用枚举、少用迭代器;
3. 对Cursor、Receiver、Sensor、File以及IO流、网络连接的步伐需要注意及时关闭、回收;
4. 少用IOC(控制反转–Inversion of Control),大量的注解和反射会导致性能的降低;
5. 使用SurfaceView替代View进行大量、频繁的绘图操作;
6. 尽量使用视图缓存(ListView中的ViewHolder)。