Android性能优化总结

一.布局优化:
优化思想就是尽量减少布局的层次,以达到减少绘制时的工作量
优化方法:
  1. 删除无用的控件和层次
  2. 使用合适的ViewGroup,如RelativeLayout
  3. 使用<include> <merge> <Viewstub>
  4. 尽量使用CompoundDrawable:对于相邻的ImageView 和 TextView,可以通过CompoundDrawable合二为一
<include>:不用重写已有布局,达到复用的效果,共享已有布局
<merge>:和<include>一起使用减少布局的层次
<Viewstub>:按需加载/延迟加载,继承了View,非常轻量级且宽高都为0,不参与布局的绘制过程,可以做到在使用时加载,提供了程序初始化的性能,需要加载ViewStub元素时,可以通过setVisibilty方法或inflate方法
可以使用Android Lint来检测布局中可以优化的地方

二.绘制优化:
在View的onDraw方法中要避免大量的操作,体现在两方面:
  1. onDraw方法中不要创建新的局部对象,因为onDraw可能会被频繁调用,从而在短时间内产生大量的临时对象,不仅占用过多的内存,而且还会导致系统频繁GC,降低了程序的执行效率
  2. onDraw方法中不要做耗时任务,也不能执行成千上万次的循环操作,尽管每次循环都很轻量级,但是大量的循环仍然十分抢占CPU的时间片,从而造成View的绘制不流畅

三.内存泄漏优化:
  1. 静态变量导致的内存泄漏:如静态的Context/View变量持有Activity或Service的Context
  2. 单例模式导致的内存泄漏:如注册了监听器,但是缺少解注册
  3. 属性动画导致的内存泄漏:如无限循环的动画,当Activity结束时,没有在onDestory里面停止动画,由于动画持有View,而View又持有Activity,从而导致Activity无法释放,出现泄漏

四.电量优化:
Android开发中耗时的特性:例如网络,定位、传感器等,对一些关键Api的正确使用也是有效降低耗电量的手段
  1. BroadcastReceiver:在页面onPause之后取消广播监听器的监听操作,同时根据业务需要选择当应用处于后台时是否禁用广播接收器
  2. 数据传输:处于后台时是否要禁用某些数据的传输,尽量避免无效数据的传输;控制数据传输的频率,传输过程中数据的大小要压缩合并网络请求,避免轮询等
  3. 位置服务:有没有及时注销位置监听器,是否要全局禁用位置监听器,控制位置监听更新频率
  4. AlarmManager:唤醒API,属于系统级别的服务,可以在特定的时刻广播一个指定的PendingIntent,可以用来启动Activity、Service或BroadcastReceiver,例如后台上传统计信息,可以通过一个AlarmManager来定时检查是否满足条件并上传记录,AlarmManager的唤醒操作比较耗时,通常情况下需要保证两次唤醒操作的时间间隔不要太短,在不需要使用唤醒功能的情况下尽早取消AlarmManager
  5. WakeLock:为了保持设备处于唤醒状态的API,因为在某些情况下,即使用户长时间不与设备交互,仍然需要阻止设备进入休眠状态,从而保证良好的用户体验,例如用户观看电影时,需要保证屏幕保持开启状态,停止使用时应该及时释放锁,重新使用时再重新获取锁

五.响应速度优化:
避免在主线程中执行耗时操作,将耗时操作放到子线程中,异步执行
ANR的分析:/data/anr/traces.txt中定位 ANR的原因
ANR的监测:使用StrictMode 或 第三方库 BlockCanary

六.网络优化
  1. 避免DNS解析:可以使用IP直连的方式,同时增加IP动态更新的能力,在IP方式访问失败时,切换到域名访问方式
  2. 合并网络请求:
  3. 预先获取数据:
  4. 避免轮询,在不得已使用时,也要避免使用Thread.sleep()函数来循环等待,较好的做法是使用系统AlarmManager,可以保证在系统休眠时CPU也可以得到休眠
  5. 优化重连机制:设定一个最大的重连次数,等待一段时间后再重试,或者根据具体的业务需要让用户决定
  6. 离线缓存
  7. 压缩数据的大小
  8. 不同网络环境下使用不同的超时策略
  9. CDN的使用:全称是内容分发网络,基本思想是尽可能避开网络上可能影响数据传输速度和稳定性的环节,从而更快、更稳定的传输数据。CDN能够缓解电信核心网络延迟带来的影响。

七.ListView的优化:
  1. 使用ViewHolder并避免在getView中执行耗时操作
  2. 其次要根据列表的滑动状态来控制任务的执行频率:如当列表快速滑动时显然不适合开启大量异步任务,此时可以停止执行异步任务
  3. 可以开启硬件加速

八.Bitmap的优化:
通过BitmapFactory.Options来根据需要对图片进行采样,采样过程中主要用到了BitmapFactory.Options的inSampleSize参数

九.线程优化:
线程优化的思想是采用线程池,避免程序中存在大量的Thread,线程池可以重用的线程,从而避免了线程的创建和销毁所带来的开销,同时线程池还能有效地控制线程池的最大并发数,避免大量的线程因抢占系统资源从而导致阻塞现象的发生。

十.其他的优化建议:
  1. 避免创建过多的对象
  2. 不要过多使用枚举,枚举占用的内存空间要比整型大
  3. 常量用static final来修饰
  4. 使用一些Android特有的数据结构,如ArrayMap,SparseArray和Pair等
  5. 适当使用软引用和弱引用
  6. 采用内存缓存和磁盘缓存
  7. 尽量采用内部静态类,这样可以避免潜在的由于内部类导致的内存泄漏
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值