Android编程规范及优化

jopen 10年前

一、编码规则

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