笔者希望做一个系列,整理 Android 基础技术,本章是关于列表卡顿问题如何分析解决
onBindViewHolder 优化
是否有耗时操作、重复创建对象、设置监听器、findViewByID、局部的动画对象等操作
是否存在内存泄漏
发生内存泄露,会导致一些不再使用到的对象没有及时释放,这些对象占用了宝贵的内存空间,很容易导致后续需要分配内存的时候,内存空间不足而出现OOM(内存溢出)。 无用对象占据的内存空间越多,那么可用的空闲空间也就越少,GC就会更容易被触发,GC进行时会停止其他线程的工作,因此有可能会造成界面卡顿等情况。
列表滑动图片加载优化
滑动过程中图片不加载、列表滑动停止才加载
if (newState == RecyclerView.SCROLL_STATE_IDLE) {
Glide.with(this).resumeRequests();
} else {
Glide.with(this).pauseRequests();
}
是否存在过度绘制、布局是否过于复杂
查看是否有不必要的背景设置
为什么开启了硬件加速会不卡顿
是否开启了硬件加速
硬件加速利用了设备的GPU来执行绘制操作,相比于软件绘制,它具有更高的性能和效率。开启硬件加速后,列表滑动时绘制操作就会交由GPU来处理,减少了CPU的负担,从而提升了滑动的流畅性,避免了卡顿现象的发生。硬件加速能够更快地完成绘制操作,并且能够更好地应对复杂布局和过度绘制等问题,提供更好的用户体验。
分析工具方法
Debug.startMethodTracing和 Debug.stopMethodTracing TraceView 能抓到当前方法以及当前方法的所有递归子方法耗时
Android Profile CPU Java/Kotlin Method Sample