1. 采用硬件加速,在androidmanifest.xml中application添加 android:hardwareAccelerated="true"。不过这个需要在android 3.0才可以使用。
2. View中设置缓存属性.setDrawingCache为true.
3. 优化你的布局。通过Android sdk中tools目录下的layoutopt 命令查看你的布局是否需要优化。
4. 动态加载View. 采用ViewStub 避免一些不经常的视图长期握住引用.
5. 将Acitivity 中的Window 的背景图设置为空。getWindow().setBackgroundDrawable(null);android的默认背景是不是为空。
6. 采用 优化布局层数。 采用来共享布局。
7. 查看Heap 的大小
8. 利用TraceView查看跟踪函数调用。有的放矢的优化。
布局优化
(原文参考:ImprovingLayout Performance)
- 尽量减少Android程序布局中View的层次,View层次越多,效率就越低
- 使用<include/>复用布局
- 使用ViewStub懒加载布局 (TODO:Android布局技巧:使用ViewStub提高UI性能)
- 使用ViewHolder、Thread使ListView滚动更加流畅
其它优化点
- 合理使用异步操作
- 懒加载:当前不需要的数据,不要加载,即按需加载。懒加载的范围是广泛的,可以是数据,可以是View,或者其它
- 使用缓存
- 图片缓存:包括MemoryCache和DiskCache,推荐使用官方DEMO中的Cache
- 单例数据缓存:建立一个管理数据的类,管理所有数据,当主界面消失后,由于Application本身没有实际退出,因此,数据本身也没有释放掉,下次启动时,省去了加载数据的时间,当然,这并不是一个好的行为。
- 使用ListView、GridView的View缓存
- 使用Message自身的缓存,避免重复创建Message实例
- 线程池
- 数据池(可参考Message Pool的实现方式)
- ……
- 数据库优化
- SQL优化
- 建立索引
- 使用事务
- …...
- 算法优化
- 用快速排序代替冒泡排序
- 用二分查找代替线性查找
- ……
- 数据结构使用
- 不要全部使用ArrayList,合理使用LinkedList等易于插入和删除的集合
- 合理使用HashMap、HashSet来提高查找性能
- 使用SparseArray、SparseIntArray、SparseBooleanArray来替代某些特定的HashMap
- ……
- 其它策略
- 可以考虑延迟处理,避免在同一时间干过多的事情
应用程序内部的性能优化
该部分的优化应该是依据程序的不同而不同,没有万般皆准的法则,目前从我做过的程序来看,实际上,上述的性能优化点基本上已经能够解决很多性能问题了。
在我所做的程序中,主要的优化手段是:
- 程序逻辑简化:分析代码,去掉冗余逻辑
- 数据结构的优化:对集合类的灵活使用,特别是HashMap的使用,极大的提高查找性能。
- 批量处理原则:对于需要循环调用地方,采用批量处理