不断学习,做更好的自己!💪
视频号CSDN简书欢迎打开微信,关注我的视频号:程序员朵朵点我点我绘制性能的好坏主要影响:Android 应用中的页面显示速度。其实质就是页面的绘制时间。我们优化的方向主要是:1.降低 View.onDraw() 的复杂度;2.避免过度绘制。
卡顿原因- 布局Layout过于复杂,无法在16ms内完成渲染。
- 同一时间动画执行的次数过多,导致CPU或GPU负载过重。
- View过度绘制,导致某些像素在同一帧时间内被绘制多次。
- UI线程中做了稍微耗时的操作。
- 降低 View.onDraw() 的复杂度
- onDraw()中不要创建新的局部对象
- 避免onDraw()执行大量 & 耗时操作
- 避免过度绘制 过度绘制 会导致屏幕显示的色块不同,具体如下:
我们要尽可能避免过度绘制:
- 尽可能地控制 过度绘制的次数 = 2 次(绿色)以下,蓝色最理想
- 尽可能避免 过度绘制的粉色 & 红色情况
- 不允许 3 次以上的过度绘制(淡红色)面积 超过 屏幕大小的 1/4
方案:
- 移除默认的 Window 背景
// 方式1:在应用的主题中添加如下的一行属性
@android:color/transparent
@null
// 方式2:在 BaseActivity 的 onCreate() 方法中使用下面的代码移除
getWindow().setBackgroundDrawable(null);
getWindow().setBackgroundDrawableResource(android.R.color.transparent);
- 移除 控件中不必要的背景
- 减少布局文件的层级(嵌套)
- 自定义控件View优化:使用 clipRect() 、 quickReject()
- 其他优化方案 [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xnWA49n2-1646969558581)(https://upload-images.jianshu.io/upload_images/9134822-f207a2c23d6ca736.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]
TraceView是Android SDK中自带的数据采集和分析工具。一般来说,通过TraceView我们可以得到以下两种数据:
- 单次执行耗时的方法。
- 执行次数多的方法。
1. 使用 Traceview 要分析Traceview,则首先要得到一个trace文件,trace文件的获取有两种方式,分别是在 DDMS 中使用和在代码中加入调试语句,下面分别对这两种方式进行介绍。
DDMS中使用 1.首先我们要打开Android Studio的Tool中的Android Device Monitor,并连接手机。 2.选择相应的进程,并单击Start Method Profiling按钮。 3.对应用中需要监控的点进行操作。 4.单击Stop Method Profiling按钮,会自动跳到TraceView视图。
代码中加入调试语句 如果开发中出现不好复现的问题,则需要在代码中添加TraceView监控语句,代码如下所示。
Debug.startMethodTracing();
...
Debug.stopMethodTracing();
在开始监控的地方调用startMethodTracing方法,在需要结束监控的地方调用stopMethodTracing方法。系统会在SD卡中生成trace文件,将trace文件导出并用SDK中的Traceview打开即可。当然不要忘了在manifest中加入 权限。
2. 分析Traceview 为了分析Traceview,我们来举一个简单的例子来生成trace文件,这里采用第二种方式:代码中加入调试语句。代码如下所示。
public class CoordinatorLayoutActivity extends AppCompatActivity {
private ViewPager mViewPager;
private TabLayout mTabLayout;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_tab_layout);
Debug.startMethodTracing("test");//1
initView();
...
}
private void initView() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
protected void onStop() {
super.onStop();
Debug.stopMethodTracing();
}
}
在注释1处调用了startMethodTracing方法开始监控,其中test是生成的trace文件的名称。在initView中我们特意调用sleep方法来做耗时操作。在onStop方法中我们调用了stopMethodTracing方法结束监控。这时会在SD卡根目录生成test.trace文件,我们将该文件导出到桌面,用Traceview来分析test.trace文件,我们在cmd中执行如下语句。