APP性能优化总结
之前工作中有了解过关于app性能优化的技术,之前也有遇到过一些比较明显的问题,比如UI界面的过度绘制,列表滑动有明显卡顿,比较耗内存等等,但以往都是有问题就解决它,没有针对性的去做相应的优化。有位同行大哥说过一句话:“功能做到,性能做好”,所以借着保证产品质量的出发点,我在这里总结下自己平常了解到关于性能优化的方法,可能不太成熟,不过可以逐步完善。
这里我大概从以下几个方面分析吧:
数据解析
我们的app一般离不开数据,实际开发中服务器端返回的数据格式无非就两种(服务端返回数据的速度也很重要)
- JSON
- XML
从解析难度和速度来看,大家都比较倾向于JSON,目前也是最主流的数据格式。在Android开发中可以使用优秀的解析库来加快我们的解析速度,XML有Jsoup,JSON有Jackson、Gson,我们可以通过这些库来帮助我们更快的完成数据解析,提高我们客户端的数据显示效率和客户体验效果。
布局优化
- 减少布局层级
- 避免过多无用嵌套
- 使用include标签重用layout
- 使用延迟加载
- 使用Hierarchy View进行层级分析,优化层级
代码优化
- 对常量使用static修饰符
- 使用静态方法,将类、变量、方法等等的可见性修改为最小
- 减少不必要的成员变量
- 尽量减少创建的新的对象
- 使用StringBuffer拼接字符串
- 不要在循环中声明临时变量,不要在循环中捕获异常。用ArrayList,手写计数循环要快3倍
int count = array.size();
for (int i = 0; i < count; i++){
System.out.println(i);
}
对于线程安全没有要求,尽量使用不安全的集合对象。
- 文件读取操作流时,及时关闭输出输入流。
- 程序频繁创建线程,考虑使用线程池。
- 适当使用软引和弱引用
- 尽量使用静态内部类,避免潜在的内存泄露
- 图片缓存,采用内存缓存LRUCache和硬盘缓存DiskLRUCache
- Bitmap优化,采用适当分辨率大小并及时回收
- 除像音乐播放器等执行后台任务,尽量使用IntentService解决,避免Service内存泄漏
- 避免使用依赖注入框架
- 当界面不可见时释放内存
- 使用Android API优化过的数据集合工具类,如,SparseArray、SparseBooleanArray、以及LongSparseArray等,使用这些API可以让我们的程序更加高效。
//性能较低的集合
HashMap<Integer,String> map = new HashMap<>();
map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");
//性能更高的集合
SparseArray<String> array = new SparseArray<>();
map.put(1,"张三");
map.put(2,"李四");
map.put(3,"王五");
- 使用proGuard混淆代码,ProGuard会对我我们的代码进行检索,删除一些无用的代码,并且类、字段、方法等进行重命名,重命名的类、字段、方法都会比原来的简短很多,这样对我们的内存占用也变得更少了。
ListView和DridView优化
- 采用ViewHolder复用convertView
- 避免在getView中执行耗时操作
- 列表在滑动状态时不加载图片
- 开启硬件加速
性能优化相关工具
- 使用Hierarchy Viewer查看UI布局层级
- 使用AndroidStudio Memory Monitor查看内存使用情况
- 使用TraceView优化App性能
- 使用内存泄露分析工具MAT分析APP内存状态
Android中引起内存泄露的原因
- 注册没取消造成内存泄露,如:广播
- 静态变量持有Activity的引用
- 单例模式持有Activity的引用
- 查询数据库后没有关闭游标cursor
- 构造Adapter时,没有使用 convertView 重用
- Bitmap对象不在使用时调用recycle()释放内存
- 对象被生命周期长的对象引用,如activity被静态集合引用导致activity不能释放
- 使用Handler造成的内存泄露
以上就是我对app性能优化的一些总结,有不成熟的地方,欢迎指正。