一、OOM & ANR
1、过多地使用内存会导致程序内存溢出,即OOM
2、过多使用CPU资源,即做大量的耗时任务,会导致手机变得卡顿甚至出现程序无法响应的情况,即ANR
二、性能优化方法
1、布局优化
(1)尽量减少布局文件的层级
a、删除布局中无用的控件和层级
b、有选择地使用性能较低的ViewGroup,比如RelativeLayout
c、布局中既可以使用LinearLayout也可以使用RelativeLayout,那么采用LinearLayout,否则采用RelativeLayout,因为RelativeLayout功能比较复杂,布局过程中需要花费大量的CPU时间
d、采用<include>标签、<merge>标签和ViewStub
<include>标签:主要用于布局重用
<merge>标签:一般和<include>标签配合使用,它可以降低减少布局的层级
ViewStub标签:提供按需加载功能,当需要时才会将ViewStub中的布局加载到内存,提高程序的初始化效率
2、绘制优化
(1)View的onDraw方法避免执行大量操作
a、onDraw中不要创建新的局部对象,原因是onDraw方法可能会被频繁调用,这样将会产生大量临时对象,不仅占用过多内存,而且还会导致系统更加频繁gc,降低程序的执行效率
b、onDraw方法中不要做耗时的任务,也不能执行成千上次的循环操作,大量的循环会抢占CPU的时间片,造成View的绘制过程不流畅
3、内存泄露优化
(1)分两方面优化
a、开发过程中避免写出有内存泄露的代码;
b、通过一些分析工具如MAT来找出潜在的内存泄露继而解决
(2)内存泄露例子
a、静态变量
静态变量内部持有当前Activity,从而导致Activity无法释放
b、单例模式
单例模式接收外部注册并将外部的监听器存储起来,使用单例模式时,调用其注册监听,但在onDestroy时没有解注册操作,从而引起的内存泄露
c、属性动画
属性动画中有一类无限循环的动画,如果在Activity播放该动画且没有在onDestroy中停止动画,从而导致Activity无法释放
4、响应速度优化
5、ListView优化
6、Bitmap优化
7、线程优化
8、一些性能优化建议
a、避免创建过多的对象
b、不要过多使用枚举,枚举占用的内存空间要比整型大
c、常量请使用static final来修饰
d、适当使用软引用和弱引用
e、采用内存缓存和磁盘缓存
f、尽量采用静态内部类,这样可以避免潜在的由于内部类而导致的内存泄露
三、提高程序的可维护性
1、命名要规范,要能正确的传达出变量或方法的含义,少用缩写,关于变量的前缀可以参考android源码的命名方式,比如私有成员以m开头,静态成员以s开头,常量则全部用大写字母表示等
2、代码的排版上需要流出合理的空白来区分不同的代码块,其中同一变量的声明要放在一块,不同变量的声明之间要留出一行空白作为区分
3、仅为非常关键的代码写注释,其他地方不写注释