Android 性能优化(内存优化和布局优化)


布局优化

  我们可以通过手机开发者选项中的调试GPU过度来查看布局绘制的复杂情况。造如成界面卡顿的原因最重要的就是丢帧,那我们就得明白什么是丢帧,如果一个界面的每秒刷新频率为60帧则该界面非常流畅,一秒钟为1000ms,用1000ms除以60得到16ms,如果这一帧画面没有在16ms内完成渲染,则会被丢掉,所以我们应该尽量使渲染时间剪短,布局优化就不得不了解了。
overdraw

  • 避免overdraw,使用RelativeLayout来替换掉多层LineraLayout嵌套
  • 减少View树的层数,Google Api文档中建议View树的高度不大于10
  • 使用<include>标签重复利用相投Layout
  • 使用<viewStub>实现延迟加载view(viewStub不会在创建布局时直接加载,而是在调用inflate或者设置Visivility为VISIBLE后被加载)
  • 使用<SurfaceView>实现布局变化较快的界面
  • 使用<merge>来插入布局,merge用于删除不必要的布局,即可用于减少布局层数,例如根布局使用了垂直的LineraLayout,引入的布局也使用了垂直的LineraLayout则这个LineraLayout就没有了意义,我们就可以使用<merge>来替代LineraLayout

内存优化

  在调试时期,我们应该尽量使用Memory Monitor(后改名Android Profiler)来查看内存情况,避免出现内存泄漏。虽然有些地方影响很小,但是聚少成多,内存是省出来的,只有关注这些细节,我们的App才会拥有更好的体验。

Android Profiler

  • Bitmap使用结束后需要手动回收,通过调用其recycle方法来进行回收(Bitmap是最容易造成内存泄漏的)
  • 使用静态方法,静态方法的速度比普通方法快15%(工具类或者常量表可使用静态方法)
  • 减少成员变量,使用局部变量替换掉只使用过一次的成员变量
  • 尽量不要使用枚举类和迭代器(枚举类占用内存远大于常量表)
  • 对于部分需要回收的类,使用后一定要关闭、回收或者解除注册,例如Cursor、Receiver、Sensor、File、IO等对象
  • 避免使用IOC框架,大量使用反射依然会造成性能下降,内存消耗较大
  • 使用RenderScript、OpenGL来进行非常复杂的绘图操作
  • 尽量使用Holder对视图进行缓存,而不是重复执行inflate方法解析视图
  • 除非必要尽量少使用Activity的context,实用Application的Context替代,避免Activity被其他类持有造成无法回收从而导致内存泄漏
  • 静态类中应该避免持有Activity的context,导致context无法回收
  • Task及其子类(TimerTask,AsyncTask等)无论是否用于循环,都需要在执行结束后或者Activity生命周期结束后被Cancle掉,否则会造成内存泄漏
  • 动画在Activity生命周期结束后也需要cancle
  • WebViwe在加载网页后会长期占有内存,需要在Activity生命周期结束后调用其destroy方法来进行销毁
  • 线程在执行结束后需要对其进行关闭,且线程数量不易过多,必要时通过线程池来管理线程
  • 通过Activity的Recreate方法来重启Activity时应该先移除之前的Fragment避免创建重复的Fragment导致内存泄漏
  • 使用较少的工具类尽量使用单例模式,少用static类,以减少不必要的类加载
  • 在AndroidMainifest中为主Activity加上clearTaskOnLaunch标签,这样一旦返回到主Activity时就销毁其他所有Activity,避免内存泄漏
  • 对于一些不必要长期持有的类,我们可以通过弱引用和软引用来减少内存占用

其他性能优化

  • 当出现需要String连续相加取值时,应该使用StringBuilder替换Stirng来追加内容
  • 避免在主线程中使用Thead.sleep方法来休眠,这样会造成页面卡顿
  • 耗内存操作应该放在新进程,避免oom超内存异常
  • 使用WakeLock时一定要及时释放锁,因为如果未释放锁导致屏幕常亮会非常耗电,像视频类APP我们需要在暂停时就释放掉锁,而不是等到停止播放或销毁Activity时才释放锁
  • AlarmManager使用闹钟唤醒也很耗电,在不使用时应该马上关闭,两次唤醒间隔不应太短



  • 6
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值