列表滑动帧率优化

1,214 阅读2分钟

前言

滑动列表帧率优化是我们开发中经常会接触到的优化。滑动帧率直接反应了列表滑动时的卡顿情况,与用户体验息息相关。

优化的几个方向

  1. 过度绘制,过度绘制会导致列表(RecyclerView)绘制时间增长,当列表的item比较复杂的时候,是非常容易造成丢帧的。
  2. 图片加载,滑动过程中,如果同时进行图片的加载,会照成CPU占用过多,如果图片的解码等发生在主线程,那么卡顿就更加容易发生了,所以在列表滑动过程中停止图片加载对帧率优化会有非常大的帮助。
  3. 耗时方法,可以通过trace 查看滑动过程中的耗时方法,以及调用的频次是否可以减少,耗时方法会造成绘制时间长,导致丢帧。优化时可以把这些耗时方法放在子线程,主线程仅仅保留与绘制相关的部分。
  4. ViewHolder预创建,滑动过程中往往会创建一些ViewHolder(在没有足够的ViewHolder可以提供复用之前),这些ViewHolder的创建,往往是通过inflate一个xml得到的,同时往往还会进行findViewById等一系列操作,这些操作在item比较复杂时是比较耗时的,往往会造成丢帧。优化方法:预创建ViewHolder,塞入RecycledViewPool中,常见的业务常见,RecyclerView展示数据之前往往都会有网络请求操作,所以我们可以充分利用网络请求的这段时间,在等待网络返回的时间里面,我们可以预创建这些ViewHolder。
  5. 线程池复用,示例:垂直的RecyclerView的每个Item都包含了一个横向的RecyclerView,这些横向的RecyclerView如果样式是一样的,那么他们可以共用一个RecycledViewPool,这样可以极大的减少横向的RecyclerView的item的创建,对帧率优化会有一定的帮助,同时,这些item也是可以预创建的。
  6. RecyclerView滑动过程中会多次调用onBindViewHolder方法,所以onBinderViewHolder中避免多次创建对象,执行耗时方法。