@946898963
2021-03-03T16:21:49.000000Z
字数 2099
阅读 804
Android控件和框架
真正带你搞懂 RecyclerView 的缓存机制,再也不怕面试被虐了
让你彻底掌握RecyclerView的缓存机制这篇文章讲解的很好,感觉有头绪的了,继续看其他的,记得看这篇文章的评论,能解决某些疑惑。
下面这篇文章也不错,接着上篇文章看
Android源码分析之RecyclerView源码分析(二)—缓存机制(从第一级获取的时候,根据id获取这个地方没看明白)
RecyclerView机制分析: Recycler
Android源码分析之RecyclerView源码分析(一)—绘制流程
RecyclerView回收机制分析通过代码详细分析了滚动的时候,ViewHolder的缓存和获取逻辑,暂时只看对代码分析得出的结论就好
RecyclerView 缓存机制 | 回收些什么?(还有一系列的文章,但是还没看)
强烈推荐:RecyclerView 的缓存复用机制(感觉还可以再看看)
RecyclerView缓存机制(有一系列的文章,还没看)
Android-RecyclerView布局显示和回收复用流程
【腾讯Bugly干货分享】Android ListView 与 RecyclerView 对比浅析—缓存机制
结合源码分析RecyclerView复用机制: Recycler
每日一问 | RecyclerView的多级缓存机制,每级缓存到底起到什么样的作用?
使用 RecyclerView 的难度可大可小,若仅展示单类型列表,只要优化视图绘制性能、降低布局复杂度,就能保证性能。
若列表分类多、样式差异大,类似微信聊天消息界面,遇到问题的难度将大幅增加。需要在预加载、复用上做进一步调优,单纯实现 onCreateViewHolder() 和 onBindViewHolder() 并不能满足需求。总的来说,要以追求视图出现在屏幕前耗费最少时间为目标。
例如:下图样式的 ViewHolder 仅缓存5个,多余视图移出屏幕后会销毁。下次需要该 ViewHolder 又要重新构建,所以提高缓存数量可减少这种情况发生次数。
RecyclerViewPool缓存可以针对多ItemType,设置缓存大小。默认每个ItemType的缓存个数是5。而且该缓存可以给多个RecyclerView共享。由于默认缓存个数为5,假设某个新闻App,每屏幕可以展示10条新闻(是第一屏有10个新闻,第二篇有10个视频,以此类推。),那么必然会导致缓存命中失败,频繁导致创建ViewHolder影响性能。所以需要扩大缓存size。
数据更新时的缓存过程
这块我就简单说一下结论,感兴趣的同学可以自行查看源码。为什么我们在有数据刷新的时候推荐大家使用notifyItemChanged等方法而不使用notifyDataSetChanged方法呢?
在调用notifyDataSetChanged方法后,所有的子view会被标记,这个标记导致它们最后都被缓存到RecyclerPool中,然后重新绑定数据。并且由于RecyclerPool有容量限制,如果不够最后就要重新创建新的视图了。
但是使用notifyItemChanged等方法会将视图缓存到mChangedScrap和mAttachedScrap中,这两个缓存是没有容量限制的,所以基本不会重新创建新的视图,只是mChangedScrap中的视图需要重新绑定一下。
问题:
RecyclerView滑动抖动?
RecyclerView预加载
RecyclerView为Item设置Id
相关问题的参考链接:
为什么 Android 在初始化的时候会 measure 和 layout 两次,但最后draw一次?
View的三次measure,两次layout和一次draw
View为什么会至少进行2次onMeasure、onLayout