Android编程规范及优化
一、编码规则
1. 函数的规模尽量限制在 200 行以内。
2. 一个方法仅完成一件功能。如果一个方法实现多个功能,可以考虑分拆成多个方法,每个方法实现一个功能。
3. 如果多段代码重复做同一件事情,那么可考虑提供一个公用的方法实现这个功能,供其它方法调用。
4. 检查函数所有参数输入的有效性。例如参数传入 ArrayList 对象为空,如果直接使用会导致程序异常。
5. 对方法的异常中应有全面的处理,不要想当然在 try 块中实现的功能中只可 能发生某一种异常,实际上可能会发生很多异常,如:IOException、NullPointerException 等,对抛出的异常最后应加上捕捉默认的 Exception,并进行处理。
6. 数据库的操作,应记得关闭游标和数据库,在需要SimpleCursorAdapter时,可使用Activity.startManagingCursor(Cursor c)来管理游标,使游标的生命周期和Activity的生命周期一致。
7. Log(系统名称 模块名称 接口名称,详细描述),方便定位问题
8. 不要重用父类的handler,对应一个类的handler也不应该让其子类用到,否则会导致message.what冲突
9. 数据一定要效验,例如字符型转数字型,如果转换失败一定要有缺省值;服务端响应数据是否有效判断;
10. 程序中使用到的资源应当被释放,以避免资源泄漏。这最好在finally块中去做。不管程序执行的结果如何,finally块总是会执行的,以确保资源的正确关闭。
11. 在OnDestroy()中 将不用的static的成员置成null
12. 遍历Collection的不要去修改或删除元素。如有删除的元素,可以在遍历之后完成。
二、 性能优化
2.1 代码优化
1. 字符串频繁操作时,多用StringBuffer而少用String
2. 尽量使用本地变量,即反复使用的变量要先保存成临时或局部变量,尤其是循环中使用的变量
3. 如果一个方法不访问(不修改)成员变量,请用static
4. 尽量不用get和set,如果你非要用的话请加上final关键字,编译器会把它当成内联函数
5. 不修改的static变量请用static final常量代替
6. 避免使用枚举,请使用常量代替(枚举需要创建对象,开销更大)
7. 不使用的引用变量要手动置null,提高内存被回收的几率
8. 用多个一维数组代替二维数组 int[][]=====int[] int[],二维数据占用的内存空间比一维数组多得多,大概10倍以上。
9. 不要在循环当中声明临时变量,不要在循环中捕获异常
10. 如果对于线程安全没有要求,尽量使用线程不安全的集合对象
11. 如果程序会频繁创建线程,则可以考虑使用线程池。
12. 创建新的对象都需要额外的内存空间,要尽量减少创建新的对象。
13. 对Context的使用如果可以用Application Context,尽量别用Activity Context,以防止Activity占用内存不能及时回收。
14. static变量在程序运行期间其内存是共享的,且只有一份,所以有时将一些变量声明为static,可以起到节约内存空间的作用,但是由于静态变量生命周期很长,不易被系统回收,所以使用静态变量要合理,不能盲目的使用。
15. 尽量避免非常大的内存分配,有时候问题不是由当时的堆状态造成的,而是因为分配失败造成的。分配的内存块都必须是连续的,而随着堆越来越满,找到较大的连续块越来越困难。
16. 尽量使用System.arraycopy ()代替通过来循环复制数组,System.arraycopy() 要比通过循环来复制数组快的多
17. 适当的使用弱引用(WeakReference)。当定义了一个对象,用弱引用记住它后,在下一次GC运行时就会把它当作无用的对象回收,和软引用的区别是不会根据内存情况判断。
2.2启动优化
1. 减少静态对象创建,尽可能不要在Application 执行静态逻辑代码。
2. Application在oncreat中,不要做io读写等耗时操作,如果要做,则尽量可能延后执行放到非UI线程去做。
3. 在减少闪屏的布局的层次,尽可能在xml中布局,而非代码中动态创建。
4. 闪屏界面Activity的theme设置为透明色,防止运行慢时出现的白屏或黑屏现象。
5. 不要在activity的onCreat, onStart,onResume的生命周期中去加载动画,尽量延迟加载,以防止出现卡屏。
2.3布局优化
1. 抽象布局标签
(1) <include>标签
include标签常用于将布局中的公共部分提取出来供其他layout共用,以实现布局模块化,这在布局编写方便提供了大大的便利。
(2) <viewstub>标签
viewstub标签同include标签一样可以用来引入一个外部布局,不同的是,viewstub引入的布局默认不会扩张,即既不会占用显示也不会占用位置,从而在解析layout时节省cpu和内存。
viewstub常用来引入那些默认不会显示,只在特殊情况下显示的布局,如进度布局、网络失败显示的刷新布局、信息出错出现的提示布局等。
(3) <merge>标签
在使用了include后可能导致布局嵌套过多,多余不必要的layout节点,从而导致解析变慢,不必要的节点和嵌套可通过hierarchy viewer或设置->开发者选项->显示布局边界查看。
2. 能用线性布局(LinearLayout)很方便的实现的,尽量用线性布局实现(效率相对高)。
3. 如果多个Activity中包含共同的UI处理,那么可以提炼一个CommonActivity,把通用部分叫由它来处理,其他activity只要继承它即可或者用fragment来实现。
4. styles.xml:将layout中不断重现的style提炼出通用的style通用组件,放到styles.xml中。
2.4图片优化
1. 如图片尺寸大于界面显示尺寸,可以转化为缩略图再加载:
BitmapFactory.Options options = new BitmapFactory.Options();
options.inSampleSize = 2;
Bitmap img = BitmapFactory.decodeFile("/sdcard/1.png", options);
2. 用ARBG_4444色彩模式加载图片:
Android中有四种,分别是:
ALPHA_8:每个像素占用1byte内存
ARGB_4444:每个像素占用2byte内存
ARGB_8888:每个像素占用4byte内存
RGB_565:每个像素占用2byte内存
Android默认的色彩模式为ARGB_8888,这个色彩模式色彩最细腻,显示质量最高。但同样的,占用的内存也最大。
3. 本地的背景图片,首先考虑用shape或者.9替代,不能代替的图片,可以考虑是否可以延后加载。
4. Bitmap不用的时候,及时调用recycle(),
5. 采用开源框架如:Universal-Image-Loader ,picasso, Volley 均实现对图片的缓存和加载优化。
2.5 ListView列表优化
1. 多用convertView缓存,减少频繁创建和加载布局,减少滑动时GC次数
2. 采用ViewHolder模式,缓存子布局,来减少findViewById使用频率,
3. ListView中item的布局至关重要,必须尽可能的减少使用的控件,布局的层级,千万不要item布局中再嵌套listView或者GridView会严重影响流畅性。
4. getView方法中不能做复杂的逻辑计算,特别是数据库操作,否则会严重影响滑动时的性能。 遇到图片等大数据的加载时,采用异步加载策略。
5. 如item条目很多可以考虑分页加载的方式,来减少内存的占用。
6. ListView的背景色与cacheColorHint设置相同颜色,可以提高滑动时的渲染性能
7. ListView,GridView的高宽尽量使用fill_parent,match_parent,或者具体高度。(使用wrap_content每次getView()都会去计算高宽,会频繁调用getView())
来自:http://my.oschina.net/mastere/blog/414657