RecyclerView的缓存机制

RecyclerView与 ListView 的缓存机制原理大致相似, 滑动的时候,离屏的 ItemView 被回收至缓存,入屏的 ItemView 则会优先从缓存中获取。是 ListView 与 RecyclerView 的实现细节有差异。

Tips:ListView只有两级缓存,RecyclerView名义上是有四级缓存,但三级缓存是空实现,需自定义,实质是有三级缓存。

ListView的缓存机制:

istView 是继承于 AbsListView ,RecycleBin 是 AbsListView 的内部类,其作用是通过两级缓存来缓存 view。

一级缓存:mActiveViews

第一级缓存,这些 View 是布局过程开始时屏幕上的 view,layout 开始时这个数组被填充,layout 结束,mActiveViews 中的 View 移动到 mScrapView,意义在于快速重用屏幕上可见的列表项 ItemView,而不需要重新 createView 和 bindView。

二级缓存:mScrapView

第二级缓存,mScrapView 是多个 List 组成的数据,数组的长度为 viewTypeCount,每个 List 缓存不同类型 Item 布局的 View,其意义在于缓存离开屏幕的 ItemView,目的是让即将进入屏幕的 itemView 重用,当 mAdapter 被更换时,mScrapViews 则被清空。

RecyclerView 四级缓存

RecyclerView 也有一个类专门来管理缓存,不过与 ListView 不同的是,RecylerView 缓存的是 ViewHolder,而且实现的是四级缓存。

一级:Scrap

对应ListView 的一级缓存,快速重用屏幕上可见的 ViewHolder。

简而言之,屏幕内显示的。

二级:Cached

对应ListView的二级缓存,如果仍依赖于 RecyclerView(比如已经滑出可视范围,但还没有被移除掉),但已经被标记移除的 ItemView 集合被添加到 mAttachedScrap 中。然后如果 mAttachedScrap 中不再依赖时会被加入到 mCachedViews 中,默认缓存 2 个 ItemView,RecycleView 从这里获取的缓存时,如果数据源不变的情况下,无需重新 bindView。

简而言之,linearlayoutmanager来说cached缓存默认大小为2,起到的作用就是rv滑动时刚被移出屏幕的viewholer的收容所。

三级:CacheExtension

第三级缓存,其实是一个抽象静态类,用于充当附加的缓存池,当 RecyclerView 从 mCacheViews 找不到需要的 View 时,将会从 ViewCacheExtension 中寻找。不过这个缓存是由开发者维护的,如果没有设置它,则不会启用。通常我们也不会设置它,除非有特殊需求,比如要在调用系统的缓存池之前,返回一个特定的视图,才会用到它。

简而言之,这是一个自定义的缓存,没错rv是可以自定义缓存行为的。

目前来说这还只是个空实现而已,从这点来看其实rv所说的四级缓存本质上还只是三级缓存。

四级:RecycledViewPool(最强大)

它是一个缓存池,实现上,是通过一个默认为 5 大小的 ArrayList 实现的。这一点,同 ListView 的 RecyclerBin 这个类一样。每一个 ArrayList 又都是放在一个 Map 里面的,SparseArray 用两个数组用来替代 Map。

把所有的 ArrayList 放在一个 Map 里面,这也是 RecyclerView 最大的亮点,这样根据 itemType 来取不同的缓存 Holder,每一个 Holder 都有对应的缓存,而只需要为这些不同 RecyclerView 设置同一个 Pool 就可以了。

简而言之, pool一般会和cached配合使用,这么来说,cached存不下的会被保存到pool中毕竟cached默认容量大小只有2,但是pool容量 也是有限的当保存满之后再有viewholder到来的话就只能会无情抛弃掉,它也有一个默认的容量大小

privatestaticfinalintDEFAULT_MAX_SCRAP = 5;

Android四级缓存,RecyclerView的四级缓存-初探相关推荐

  1. 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:黄宁源 一,背景 RecyclerView是谷歌官方出的一 ...

  2. Android 控件 RecyclerView 看这篇就够了

    [Android 控件 RecyclerView] 概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传 ...

  3. Android 控件 RecyclerView

    [Android 控件 RecyclerView] 概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传 ...

  4. [Android]ListView性能优化之视图缓存

    前言 ListView是Android中最常用的控件,通过适配器来进行数据适配然后显示出来,而其性能是个很值得研究的话题.本文与你一起探讨Google I/O提供的优化Adapter方案,欢迎大家交流 ...

  5. 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )

    文章目录 一.Google 官方 Bitmap 相关示例参考 二.磁盘缓存类 DiskLruCache 三.磁盘缓存初始化 四.存储数据到磁盘缓存中 五.从磁盘缓存中读取数据 六. Android 1 ...

  6. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )

    文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...

  7. 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )

    文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...

  8. Android 程序常用功能《清除缓存》

    用户在使用我们所研发的App的时候,通常都会遇到如下的问题: 使用过程中可能会遇到应用程序或软件更新失败,因为用户的智能手机存储空间不足. 由于应用程序崩溃和其他问题,用户的数字设备运行速度比以前慢. ...

  9. Connor学Android - Bitmap的加载和缓存策略

    Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...

最新文章

  1. c语言求婚代码大全,这是我见过最浪漫的程序员求婚方式
  2. 编程珠玑第二章习题答案
  3. __proto__(隐式原型)与prototype(显式原型)
  4. 第一次有人把“分布式事务”讲的这么简单明了
  5. 只需 4 步,自己搞个 Spring Boot Starter!
  6. 遗传算法实例-求解函数极值
  7. 提高电脑开机速度的一些基本操作
  8. asp点击按钮sql列求和_SQL 结构化查询语言
  9. 基于JAVA+SpringMVC+Mybatis+MYSQL的学习资源交互系统
  10. 图论 - 寻找fly真迹
  11. java服务端验证框架_SpringBoot服务端数据校验过程详解
  12. CMOS摄像头驱动分析笔记1
  13. PROC文件及文件夹创建
  14. MySQL删除s表命令_SQL语句中删除表数据drop、truncate和delete的用法
  15. Ubuntu下mysql远程连接失败MySQL said: Can't connect to MySQL server on 'XXXXXX' (61)
  16. Java中对象属性的初始化顺序
  17. 梯度下降和随机梯度下降
  18. 怎么把静态图片做成动态图?简单三步让图片动起来
  19. R语言统计分析之方差分析
  20. 看盘做短线的10种方法

热门文章

  1. 关于苹果, 有多少事可以重提
  2. 软件设计方法和设计决策
  3. goland 修改.gitignore无效问题
  4. 《Go 语言程序设计》读书笔记 (三) 方法
  5. 在浏览器设置里能看到cookie, 页面调试Application里看不到
  6. Spring事件机制Event源码解析(未完待续)
  7. @AspectJ中的切点表达式详解
  8. BIO、NIO、AIO的区别
  9. 使用iText来生成PDF
  10. quartz监听器使用