Android四级缓存,RecyclerView的四级缓存-初探
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的四级缓存-初探相关推荐
- 【腾讯Bugly干货分享】Android ListView与RecyclerView对比浅析--缓存机制
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5811d... 作者:黄宁源 一,背景 RecyclerView是谷歌官方出的一 ...
- Android 控件 RecyclerView 看这篇就够了
[Android 控件 RecyclerView] 概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传 ...
- Android 控件 RecyclerView
[Android 控件 RecyclerView] 概述 RecyclerView是什么 从Android 5.0开始,谷歌公司推出了一个用于大量数据展示的新控件RecylerView,可以用来代替传 ...
- [Android]ListView性能优化之视图缓存
前言 ListView是Android中最常用的控件,通过适配器来进行数据适配然后显示出来,而其性能是个很值得研究的话题.本文与你一起探讨Google I/O提供的优化Adapter方案,欢迎大家交流 ...
- 【Android 内存优化】Bitmap 硬盘缓存 ( Google 官方 Bitmap 示例 | DiskLruCache 开源库 | 代码示例 )
文章目录 一.Google 官方 Bitmap 相关示例参考 二.磁盘缓存类 DiskLruCache 三.磁盘缓存初始化 四.存储数据到磁盘缓存中 五.从磁盘缓存中读取数据 六. Android 1 ...
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 内存复用 | 弱引用 | 引用队列 | 针对不同 Android 版本开发不同的 Bitmap 复用策略 | 工具类代码 )
文章目录 一.Bitmap 复用池 二.弱引用 Bitmap 内存释放 三.从 Bitmap 复用池中获取对应可以被复用的 Bitmap 对象 1.Android 2.3.3(API 级别 10)及以 ...
- 【Android 内存优化】Bitmap 内存缓存 ( Bitmap 缓存策略 | LruCache 内存缓存 | LruCache 常用操作 | 工具类代码 )
文章目录 一.Bitmap 内存缓存策略 二.LruCache 内存缓存 三.LruCache 常用操作 四.LruCache 工具类 五.源码及资源下载 官方参考 : Google 官方提供的 内存 ...
- Android 程序常用功能《清除缓存》
用户在使用我们所研发的App的时候,通常都会遇到如下的问题: 使用过程中可能会遇到应用程序或软件更新失败,因为用户的智能手机存储空间不足. 由于应用程序崩溃和其他问题,用户的数字设备运行速度比以前慢. ...
- Connor学Android - Bitmap的加载和缓存策略
Learn && Live 虚度年华浮萍于世,勤学善思至死不渝 前言 Hey,欢迎阅读Connor学Android系列,这个系列记录了我的Android原理知识学习.复盘过程,欢迎各位 ...
最新文章
- c语言求婚代码大全,这是我见过最浪漫的程序员求婚方式
- 编程珠玑第二章习题答案
- __proto__(隐式原型)与prototype(显式原型)
- 第一次有人把“分布式事务”讲的这么简单明了
- 只需 4 步,自己搞个 Spring Boot Starter!
- 遗传算法实例-求解函数极值
- 提高电脑开机速度的一些基本操作
- asp点击按钮sql列求和_SQL 结构化查询语言
- 基于JAVA+SpringMVC+Mybatis+MYSQL的学习资源交互系统
- 图论 - 寻找fly真迹
- java服务端验证框架_SpringBoot服务端数据校验过程详解
- CMOS摄像头驱动分析笔记1
- PROC文件及文件夹创建
- MySQL删除s表命令_SQL语句中删除表数据drop、truncate和delete的用法
- Ubuntu下mysql远程连接失败MySQL said: Can't connect to MySQL server on 'XXXXXX' (61)
- Java中对象属性的初始化顺序
- 梯度下降和随机梯度下降
- 怎么把静态图片做成动态图?简单三步让图片动起来
- R语言统计分析之方差分析
- 看盘做短线的10种方法