问题:
——UI性能
——资源消耗
——存储性能
——代码逻辑
一、UI卡顿
原因——Android的UI流畅绘制的帧率规定为60fps,即16ms/帧;
结论——尽量保证每次在16ms内处理完所有的CPU与GPU计算、绘制、渲染等操作,否则会造成丢帧卡顿问题。
还有一个原因是:虚拟机在执行GC垃圾回收操作时所有线程(包括UI线程)都需要暂停,当GC垃圾回收完成之后所有线程才能够继续执行。若果绘制时恰好碰到这种情况,也可能造成卡顿。
1.常见卡顿情况
1)在UI线程进行耗时操作;
2)频繁的请求网络,尤其是listview加载的时候,并且其中还有图片;
3)布局太复杂,嵌套层次太多,导致不能在16ms里绘制完成
4)过度绘制,比如背景图片或者颜色重复加载多次(往往是不需要的),使CPU或GPU负载过重;、
5)动画使用不合理,执行过多等;
2.处理方法
1)不要在UI线程进行耗时操作,耗时操作放在子线程处理;
2)listview的滑动优化:不要一次加载过多数据;大数据进行分页加载;图片使用缩略图;图片可以进行缓存处理;有时候,数据也可以进行缓存处理;合理利用viewholder(listview需要自己写,RecyclerView已经必须要写);可以监听滑动状态,在快速滑动的时候,插入默认图片,在滑动停止后加载正确图片;
3)减少布局的嵌套层次,合理运用各种布局;比如用RelativeLayout代替LinearLayout等;
4)减少不必要的背景色,可以在手机中打开开发者模式,打开里面的GPU过度绘制工具查看APP的绘制情况,减少红色区域的产生;
5)动画的合理使用。
2.关于资源消耗
在android中,资源消耗比较大的情况应该是创建(new )实例。比如new Thread().或者达到一个目的有多重不同的方法,其资源消耗也不同。比如,计时器,有计时功能的有Timer类,有时候thread.sleep()也OK ,但是熟练了的话,就知道AlarmManager是个很好用的东西。
处理:
1)合理的创建实例,不要每次都new出来,能循环利用的尽量循环利用;
2)在1的基础上,合理运用各种“池”,比如线程池ExecutorService;
3)合理选择API,尽量选用资源消耗最少的使用;
eg1:关于字符串拼接:如果我们拼接的是字符串常量则String效率比StringBuffer高,如果拼接的是字符串对象,则StringBuffer比String效率高。
eg2:当数据量不大(千位级内)且Key为int类型时使用SparseArray替换HashMap效率高;当数据量不大(千位级内)且数据类型为Map类型时使用ArrayMap替换HashMap效率高;其他情况下HashMap效率相对高于二者。
其他的:
——Handler发送消息时尽量使用obtain去获取已经存在的Message对象进行复用,而不是新new Message对象,这样可以减轻内存压力;
——在使用后台Service时尽量使用IntentService,这样可以减轻系统压力、省电、省内存、省CPU占用率;
——尽量减少锁个数、减小锁范围,避免造成性能问题;
——合理的选择使用增强型for循环代替普通for循环;
等等;
3.存储性能
合理处理内存泄漏和溢出。
一个很好的逻辑是,使用内存存储——磁盘存储——网络存储三级存储方式。
4.代码逻辑
重构——不得不说,往往开发的时候很多逻辑都是按需求来写,到哪里就写什么方法,这样就造成逻辑比较混乱,因此精简代码就是必须要做的事,不仅提高代码的可读性,还要做到代码逻辑规范,高效。
比如一个activity需要有这些模块:初始化模块;还可分出一个监听模块;网络处理模块;数据加载模块等;
最后,有句话叫做“不要重复制造轮子”,多借鉴一些成功的第三方库,学习,吸收。