Android 性能优化
我们在开发APP时,由于设备性能的限制和用户体验的要求,我们必须在开发过程中考虑性能问题。从三个方面来谈下:响应时间、内存、电量。
1 响应时间
响应步骤可以分为:用户操作-逻辑处理-网络交互-页面展示。
逻辑处理:
清理程序逻辑,减少不必要的操作,不分配不必要的内存。
1)不要在for循环中声明临时变量和写try-catch。
2)合适使用数据类型,比如:StringBuilder或StringBuffer、少用enum、少用父类声明(list、map)
3) 如果需要频繁的new Theard,使用线程池。
4) 正确使用单例模式
5)多用常量
6)使用策略模式进行解耦
网络交互:使用缓存 1)使用线程池 2)图片缓存 3)消息缓存,使用obtainMessage实现消息复用 4)listVIew缓存 5)网络缓存 6)layout缓存
控制最大请求量,及时取消请求,过滤重复的请求,设置超时,设置优先级。
页面展示:使用hierarchy viewer 和 lint 分析布局
1) 尽可能的减少布局层次, 使用<includ>、<viewstub>、<merge>。 UI绘制流程:measure - layout - draw;measure和layout都需要循环所有的子控件。所以子控件越多,消耗时间越长。
2)ViewPager 同时缓存pager数最好为最小数3,过多就会卡。 每个pager在使用时再加载网络和数据库的数据,不要预加载。
3) 使用RelativeLayout 代替 LinearLayout
4)避免过度绘制(OverDraw)
5) 尽可能为所有分辨率准备资源,减少硬件缩放,加快UI绘制速度
6) 使用lrucache 和disklrucache;使用网络+数据库,每个activity和fragment设置一个最小请求时间间隔。
2 内存
traceview 分析性能
1) bitmap消耗内存,在图片比较大的时候,容易产生OOM,需要使用BitMapFactory.options缩放。使用完之后,及时使用BitMap.recycle()及时回收。
3 电量
电量消耗分为两部分:绘制图片、摆放布局;上报数据、定位、定时检索后台数据。
措施:1)减少唤醒屏幕的次数和时间,使用wakelock时正确执行唤醒操作并根据设定关闭操作。
2)非必须马上执行的操作,可以等到充电或电量足的时候进行。如:文件上传、图片处理。
3)将多次网络请求打包为一次,可以避免过多次的网络请求产生的电量消耗。