【ANR/UI卡顿】
2018-02-24 本文已影响23人
小呀么小黄鸡
UI卡顿
1、UI卡顿原理
View的绘制帧数保持60fps是最佳,这要求每帧的绘制时间不超过16ms(1000/60),如果安卓不能在16ms内完成界面的渲染,那么就会出现卡顿现象
2、UI卡顿的原因分析
- 在UI线程中做轻微的耗时操作,导致UI线程卡顿
- 布局Layout过于复杂,无法在16ms内完成渲染
- 同一时间动画执行的次数过多,导致CPU和GPU负载过重
- overDraw,导致像素在同一帧的时间内被绘制多次,使CPU和GPU负载过重
- View频繁的触发measure、layout,导致measure、layout累计耗时过多和整个View频繁的重新渲染
- 频繁的触发GC操作导致线程暂停,会使得安卓系统在16ms内无法完成绘制
- 冗余资源及逻辑等导致加载和执行缓慢
- ANR
3、UI卡顿的优化
-
布局优化
- 使用include、ViewStub、merge
- 不要出现过于嵌套和冗余的布局
- 使用自定义View取代复杂的View
-
ListView优化
- 复用convertView
- 滑动不加载
-
背景和图片优化
- 缩略图
- 图片压缩
-
避免ANR
- 不要在UI线程中做耗时操作
过渡绘制
避免在Service的onBind和onStartCommand中执行耗时操作,如确实有需要要改用IntentService,并谨记线程同步
Intent intent = new Intent(this, MyIntentService.class);
startService(intent);
避免在BroadcastReceive#onReceive中执行耗时操作,如果有耗时操作应该创建IntentService完成,而不应该在receiver中创建子线程进行