掌握这17张图,没人比你更懂RecyclerView的预加载 - 掘金
什么是预拉取
_预拉取_指的是在已知需要某部分数据的前提下,利用系统资源闲置的空档,预先拉取这部分数据到本地,从而提高执行时的效率。
- 在UI线程处于空闲的状态
- 预先拉取待进入屏幕区域内的一部分列表项视图并缓存起来
- 从而减少因视图创建或数据绑定等耗时操作所引起的卡顿。
预拉取的实现
缓存复用的实际工作委托给了其内部的Recycler类 RecyclerView把预拉取的实际工作委托给了一个名为GapWorker的
recyclerView的滑动性能除了上一节的缓存机制,还有预加载机制也做出了贡献。 预加载之所以出现,是因为在UI Thread中,在每个vsync信号到来之间,还存在有很多cpu空闲的时间,预加载便是利用这个时间去进行的。 一个视图被展示在屏幕上可以理解为下面几个角色的合作:UI Thread、RenderThread、SurfaceFlinger、HAL 其中UI Thread是我们开发者主要涉及到的线程,它在每个vsync信号到来之际,去执行input、aniation、measure、layout、draw这些流程,把它们组装成一个displayList,并封装成一个renderNode同步给Render Thread Render Thread则会把这些node转化成openGL指令,并通过GPU绘制到Graphic Buffer中,然后跟surfaceFlinger去交换这些buffer SurfaceFlinger拿到buffer之后,会执行layer合并,最终将数据交给HAL绘制到屏幕上。
在UI Thread中,如果input开始滑动,那么就会post一个Prefetch Runnable,在这个runnable中,首先会根据滑动方向确定viewHolder类型,然后获取该type的viewHolder的平均创建时间,然后跟下一个vsync信号到来的时间对比,如果时间还充裕,那么就会尝试去创建viewHolder,然后根据所剩的时间,尝试去bindViewHolder,在下一个vysnc信号来的时候,如果bindViewHolder也完成了,那么会之间放进mCachedViews中,如果创建成功,但bind失败,则放进mRecyclerPool中。