布局优化
避免Overdraw
overdraw,过度绘制会浪费较多的Cpu和Gpu资源。Android系统在在开发者选项中提供了“Enable GPU Overdraw”工具,可以通过界面上的颜色来判断Overdraw的次数,不过由于项目只是在虚拟机上运行,所以项目中没有使用
布局层次优化
因为在Android系统中对View进行测量、布局,绘制时是通过对View的数量来进行遍历的,所以过多的View导致view的高度过高,就会影响对View进行测量、布局,绘制。所以在布局复杂的情况下尽量使用RelativeLayout,不过,由于RelativeLayout至少要绘制两次(对子View分别进行了竖直和水平方向的两次测量),而LinearLayout在不使用layouy_weight属性的情况下只测量一次,因而在其它布局嵌套比较少的时候还是推荐使用LinearLayout
使用include标签重用Layout
有一点需要注意的是:如果需要在include标签中覆盖类似原布局中的android:layout_XXX,就必须在include标签中同时指定android:layout_width和android:layout_height属性(原因可以参照Android控件架构)
使用ViewStub实现View的延迟加载
ViewStub是一个轻量级组件,大小为0.例:
首先创建一个布局,在初始化时不需要显示,只有某些情况下才显示
android:layout=“@layout/useless”,
接下来有两种方式来重新显示:通过调用setVisibity()方法来调用或inflate()来调用,唯一的区别是inflate()方法可以再次通过View.findViewById()方法来找到对应的控件。需要注意的是,不管是哪种方式使布局显示了,ViewStub也就消失了。相比于View.Gone ,ViewStub在布局中更具优势
或者是在onCreate()中使用addView
内存优化
Android系统使用的沙箱机制,每个应用使用的内存是有效的,内存低会触发LMK。涉及OOM问题(细看),内存泄露,对象引用问题(细看java回收机制)
优化例子:
Bitmap优化
使用适当分辨率和大小的图片,使用图片缓存(内存缓存和硬盘缓存)
代码优化
对常量使用static修饰符(static的作用)
使用静态方法(比普通方法提高15%左右的访问速度)
减少不必要的成员变量
减少不必要的对象,使用基础类会比使用对象更加节省资源
尽量不要使用枚举和迭代器
对Cursor、Receiver、Sensor、File等对象,注意回收
避免使用ioc框架,ioc使用注解、反射来进行实现,大量反射会带来性能的下降
使用RenderScript、OpenGL来进行复杂的绘图操作
使用SurfaceView来代替View进行大量、频繁的绘图操作
尽量使用视图缓存,而不是每次使用inflate()方法来解析视图
使用MAT工具来进行优化
生成HPROF文件和分析HPROF文件