您的位置:首页 > 移动开发 > Android开发

安卓应用优化篇

2014-10-17 00:00 225 查看
摘要: 高级程序员-安卓应用优化篇

类和对象使用技巧

尽量少用new生成新对象

使用clone方法生成新对象

尽量使用局部变量栈变量

减少方法调用

使用final类和final/static/private方法

让访问实例内变量的 getter/setter 方法变成final

避免不需要的 instanceof 操作

避免不需要的造型操作

尽量重用对象

不要重复初始化变量

不要过分创建对象

Java IO技巧

使用缓冲提高IO性能

lnputStream比Reader高效,OutputStream比Writer高效

在适当的时候用byte替代char

有缓冲的块操作IO要比缓冲的流字符IO快

序列化时使用原子类型

在finally块中关闭stream

SQL语句

尽早释放资源

异常Exceptions使用技巧

避免使用异常来控制程序流程

尽可能重用异常

将trycatch 块移出循环

线程使用技巧

在使用大量线程Threading的场合使用线程池管理

防止过多的同步

同步方法而不要同步整个代码段

在追求速度的场合用ArrayList和HashMap代替Vector和Hashtable

使用notify而不是notifyAll

不要在循环中调用 synchronized同步方法

单线程应尽量使用 HashMap,ArrayList

其它常用技巧

奇偶判断

使用移位操作替代乘除法操作可以极大地提高性能

对Vector中最后位置的添加删除操作要远远快于埘第一个元素的添加删除操作

当复制数组时使用System.arraycop方法

使用复合赋值运算符

用int而不用其它基本类型

在进行数据库连接和网络连接时使用连接池

用压缩加快网络传输速度一种常用方法是把相关文件打包到一个jar文件中

在数据库应用程序中使用批处理功能

消除循环体中不必要的代码

为vectors 和 hashtables定义初始大小

如果只是查找单个字符的话用charat代替startswith

在字符串相加的时候使用 charat()代替startswith() 如果该字符串只有一个字符的话

对于 boolean 值避免不必要的等式判断

对于常量字符串用string 代替 stringbuffer

用stringtokenizer 代替 indexof 和substring

使用条件操作符替代if cond else 结构

不要在循环体中实例化变量

确定 stringbuffer的容量

不要总是使用取反操作符

与一个接口 进行instanceof 操作

采用在需要的时候才开始创建的策略

通过 StringBuffer 的构造函数来设定他的初始化容量可以明显提升性能

合理使用 javautilVector

不要将数组声明为public static final

HaspMap 的遍历

array数组和 ArrayList 的使用

StringBufferStringBuilder 的区别

尽量使用基本数据类型代替对象

用简单的数值计算代替复杂的函数计算比如查表方式解决三角函数问题

使用具体类比使用接口效率高但结构弹性降低了但现代 IDE都可以解决这个问题

考虑使用静态方法

应尽可能避免使用内在的GET/SET 方法

避免枚举浮点数的使用

二维数组比一维数组占用更多的内存空间大概是 10倍计算

SQLite

实际上,Android本身的Training文档也提供给我们很多可参考的内容,以下仅枚举一些KeyPoint,当然,有的内容是与上面的策略是重复的。
原文参考:Performance Tips
译文参考:android应用开发者指南:性能优化(1)
其它参考:Android开发性能优化简介
总体上来说,想要写出高效代码,我们要遵循两条基本的原则:

不作没有必要的工作。

尽量避免内存分配。

Key Point:

避免创建不必要的对象

用静态代替虚拟

避免内部的Getters/Setters

对常量使用Static Final修饰符

使用改进的For循环语法(for-each)

在有内部类的情况考虑使用包权限来替代私有访问

避免使用浮点数

了解并使用类库

合理利用Native方法

通用Android性能优化布局优化
(原文参考:ImprovingLayout Performance)

尽量减少Android程序布局中View的层次,View层次越多,效率就越低

使用<include/>复用布局

使用ViewStub懒加载布局 (TODO:Android布局技巧:使用ViewStub提高UI性能)

使用ViewHolder、Thread使ListView滚动更加流畅

其它优化点

合理使用异步操作

懒加载:当前不需要的数据,不要加载,即按需加载。懒加载的范围是广泛的,可以是数据,可以是View,或者其它

使用缓存

图片缓存:包括MemoryCache和DiskCache,推荐使用官方DEMO中的Cache

参考:DisplayingBitmaps Efficiently

单例数据缓存:建立一个管理数据的类,管理所有数据,当主界面消失后,由于Application本身没有实际退出,因此,数据本身也没有释放掉,下次启动时,省去了加载数据的时间,当然,这并不是一个好的行为。

使用ListView、GridView的View缓存

使用Message自身的缓存,避免重复创建Message实例

线程池

数据池(可参考Message Pool的实现方式)

……

数据库优化

SQL优化

建立索引

使用事务

…...

算法优化

用快速排序代替冒泡排序

用二分查找代替线性查找

……

数据结构使用

合理使用HashMap、HashSet来提高查找性能

使用SparseArray、SparseIntArray、SparseBooleanArray来替代某些特定的HashMap

……

不要全部使用ArrayList,合理使用LinkedList等易于插入和删除的集合

其它策略

可以考虑延迟处理,避免在同一时间干过多的事情

应用程序内部的性能优化 该部分的优化应该是依据程序的不同而不同,没有万般皆准的法则,目前从我做过的程序来看,实际上,上述的性能优化点基本上已经能够解决很多性能问题了。
在我所做的程序中,主要的优化手段是:

程序逻辑简化:分析代码,去掉冗余逻辑

数据结构的优化:对集合类的灵活使用,特别是HashMap的使用,极大的提高查找性能。

批量处理原则:对于需要循环调用地方,采用批量处理

总结
性能优化本身是对代码的重构和反思过程,通过优化性能,能找出我们很多设计、逻辑上的不足。
优化的过程往往很痛苦,但在做过这个过程后,个人在编程水平、设计水平上都会有很大的提高。
很多优化的思想应该做为编码规范的一部分,需要我们反复实践,在写代码时,第一反应所得出的代码就是最优的。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android优化