概述
应用程序的响应是由ActivityManager和WindowManager系统服务监视的。(Activity实现了Window.Callback和KeyEvent.Callback),当主线程对输入事件5s内没有做出响应、BroadcastReceiver的onReceive()方法10s内没有处理完毕或者Service的各个生命周期方法20s内没有处理完毕。
体现
- 启动速度慢,进入界面卡顿
- 动画执行不流畅
- 列表滑动卡顿
- 不响应用户事件
产生原因及解决方法
- UI线程进行耗时操作
避免在主线程进行耗时操作,可以放入子线程进行。合理使用多线程编程。 - 采用合理的数据结构
- 数据结构不同,其内存占用也不同
- 布局嵌套过多
- 用ViewStub或者merge减少视图层级
- 延迟加载
- 问题:ViewStub,merge,include的区别?
- include:重用布局。
- merge:减少视图层级。例如:外层是垂直布局,引入一个垂直布局的include,这时这个include的LinearLayout就没意义了,可以使用merge。
- ViewStub:当你需要时才会加载。例如:进度条,网络请求的状态等可以使用,可以减少内存使用,加快渲染速度。它是一个不可见的,大小为0的view。不支持merge标签。
- 同一时间动画执行次数过多,CPU或GPU负载过重
- view的过度绘制,频繁measure,layout
- 问题:什么是view的过度绘制?
指的是同一像素被绘制多次,Android手机开发者模式中有Debug GPU overdraw(调试GPU过度绘制)开关。可以检测得到。(有四种颜色:蓝,淡绿,淡红,红)。 - 优化:
- ①activity在setContentView时会自动填充一个默认背景,如果不需要这个背景,要取消掉,getWindow.setBackgroundDrawable(null)
- 减少层级嵌套,如果有多个布局设置了同样的background,可以把无用的去掉
- 问题:什么是view的过度绘制?
- 频繁GC
- Application里初始化太多第三方sdk
怎么查看日志
找到/data/anr/traces.txt文件。真机访问不了,必须通过adb命令行导出来(adb pull)