首页 > 代码库 > 安卓应用优化篇
安卓应用优化篇
类和对象使用技巧
尽量少用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的使用,极大的提高查找性能。
批量处理原则:对于需要循环调用地方,采用批量处理
总结
性能优化本身是对代码的重构和反思过程,通过优化性能,能找出我们很多设计、逻辑上的不足。
优化的过程往往很痛苦,但在做过这个过程后,个人在编程水平、设计水平上都会有很大的提高。
很多优化的思想应该做为编码规范的一部分,需要我们反复实践,在写代码时,第一反应所得出的代码就是最优的。
安卓应用优化篇