Android四级缓存,RecyclerView 源码四级缓存原理
入口
我们从使用功能上去读取源码,通常的用法是这个样子
-> 我们设置layoutmanager,GridLayouManager 继承LinearLayoutManager,所以我们就LinearLayoutManager 为基准查看
rv.layoutManager = GridLayoutManager(this,5)
rv.addItemDecoration(DividerItemDecoration(this,LinearLayout.VERTICAL))
-> kotlin 写法给数据源
var result: List = (1..1000).map { it.toString() }
rv.adapter = CustomAdapter(this, result as MutableList)
recycler.png
看复用机制的话,我们从滑动看起。
滑动的处理时间,一般就在onTouchEvent 的 MotionEvent.Move事件看起
入口:滑动 Move 事件 --> scrollByInternal --> scrollStep --> mLayout.scrollVerticallyBy (RecyclerView 用了模板方法默认返回0,所以我们看他的实现方法在LineaLayoutManager里面找)
--> scrollBy -->(consumed) fill --> (while循环)layoutChunk --> layoutState.next --> addView(view);
layoutState.next --> getViewForPosition --> tryGetViewHolderForPositionByDeadline -->
tryGetViewHolderForPositionByDeadline 和缓存分析
怎么从集合中去获取:tryGetViewHolderForPositionByDeadline,分几种情况去获取ViewHolder
getChangedScrapViewForPosition -- mChangeScrap 与动画相关
getScrapOrHiddenOrCachedHolderForPosition -- mAttachedScrap 、mCachedViews
getScrapOrCachedViewForId -- mAttachedScrap 、mCachedViews (ViewType,itemid)
mViewCacheExtension.getViewForPositionAndType -- 自定义缓存 -- (使用情况:局部刷新??)
getRecycledViewPool().getRecycledView -- 从缓冲池里面获取
RecycledViewPool -- 缓存池
ViewHolder -- 包装View的 --- ItemView
当没有缓存的时候??--- mAdapter.createViewHolder --》 onCreateViewHolder
多级缓存的目的 -- 为了性能
创建ViewHolder 后 绑定: tryBindViewHolderByDeadline--》 mAdapter.bindViewHolder--》onBindViewHolder
回收机制,缓存机制
回收(缓存)机制:看这一个情况--- ViewHolder
LinearLayoutManager.onLayoutChildren --> detachAndScrapAttachedViews --> scrapOrRecycleView
--> 1.recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存
--> 1.ViewHodler改变 不会进来 -- 先判断mCachedViews的大小
--> mCachedViews.size 大于默认大小 --- recycleCachedViewAt
--- >addViewHolderToRecycledViewPool --- 缓存池里面的数据都是从mCachedViews里面出来的
--> 2.addViewHolderToRecycledViewPool --> getRecycledViewPool().putRecycledView(holder);
--> scrap.resetInternal(); ViewHolder 清空
--> 2.recycler.scrapView(view);
recycler_cache.png
mCachedViews当前的大小 如果 大于等于mViewCacheMax(默认的CachedViews的大小)
ViewType --
缓存池 里面保存 只是 ViewHolder 类型 没有数据
去查找缓存和复用的一种情况
入口:复用:RecyclerView.onLayout --> dispatchLayout --》 dispatchLayoutStep2 --》 onLayoutChildren --》 fill
缓存:fill -->recycleByLayoutState-->recycleViewsFromStart --> recycleChildren
--> removeAndRecycleViewAt --> recycler.recycleView
--> recycler.recycleViewHolderInternal(viewHolder); -- 处理 CacheView 、RecyclerViewPool 的缓存
Android四级缓存,RecyclerView 源码四级缓存原理相关推荐
- Guava缓存器源码分析——缓存统计器
Guava缓存器统计器实现: 全局统计器-- 1.CacheBuilder的静态成员变量Supplier<StatsCounter> CACHE_STATS_COUNTER初始化时,重载的 ...
- Mybatis 缓存系统源码解析
Mybatis 缓存系统源码解析 转载于:https://juejin.im/post/5bfa50905188251d0920006c
- MyBatis 源码分析 - 缓存原理
1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...
- Spring源码 - 从缓存中获取单例Bean
# Spring源码 - 从缓存中获取单例Bean Spring版本:Spring 5.3.13-release # 1.从缓存中获取单例Bean 单实例Bean在Spring的同一个容器中只会创建一 ...
- 直播电商源码使用缓存,将面临什么问题
直播电商源码使用缓存的设计包含很多技巧,设计不当将会导致严重的后果.本文将介绍缓存使用中常见的三大问题,并给出相应的解决方案. 1. 缓存穿透 在大多数直播电商源码中,缓存的使用方式如下图所示: 当业 ...
- RecyclerView 源码分析
RecyclerView 源码分析 写在前面: RecyclerView 是一个越用越优雅的控件,相信大家对于 RecyclerView 的使用也已经比较熟悉了.其功能的高度解耦化,规范 ViewHo ...
- RecyclerView 源码分析(一):Recycler
文章目录 前言 RecyclerView.Recycler 主要成员变量 RecycledViewPool 成员变量 主要方法 getScrapDataForType setMaxRecycledVi ...
- 140款Android开源优秀项目源码
140款Android开源优秀项目源码 BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefresh ...
- 【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码
http://www.linuxidc.com/Linux/2016-01/127292.htm 终于成功把Android 6.0 r1源码的源码编译.先上图,这是在Ubuntu中运行的Android ...
最新文章
- mac上mysql关闭不了了_python操作mysql数据库
- swift支持多线程操作数据库类库-CoreDataManager
- 人工智能高考511分,未来有望考上东京大学!
- 模拟浏览器自动化测试工具Selenium之六设置代理篇
- 【Python翻屏软件】英文1秒翻,水准堪比专九,这下考级有救了。
- [数分提高]2014-2015-2第7教学周第2次课 (2015-04-16)
- kafka 出现Java heap space的解决方法
- python 按键精灵 离线_python,PyAutoGUI,自动操作鼠标键盘,类似按键精灵
- 【转】%~dp0是什么意思
- spring异常处理实例(登录例子)
- SpringCloud——服务短路
- gridview的sort_C#教程之Gridview自动排序功能的实现
- 泰信科技携手浙大建高校IT运维平台
- ionic安装和创建项目
- Elasticsearch-analysis-pinyin7.6.0--可选参数详情
- d2lzh_pytorch安装
- 条件随机场(CRF)原理和实现
- Springboot启动报错[ main] o.s.boot.SpringApplication: Application run failed
- html添加背景音乐自动循环播放,html在谷歌浏览器的背景音乐怎么做才能自动循环播放...
- C#将查询到的数据库里面的数据输出到textbox控件
热门文章
- Java31 gt gt gt 2_Java Template.binding方法代碼示例
- php 打印行数,php/html-按行和列配置钻石数量的打印格式
- 山东省第十届ACM浪潮杯补题
- HJ浇花(牛客竞赛 约束差分)
- hdu 1408(高精度)坑人嫩
- 计算机应用大一题,大一计算机应用基础习题与答案(精选).doc
- 小程序开发学习(5)---实现天气预报小程序
- bh1750采集流程图_lcd_bh1750 通过 采集环境光照度,并在野火stm32mini板子的屏幕上显示。 SCM 机开发 272万源代码下载- www.pudn.com...
- mysql5.0源码安装_linux小白 mysql5.0源码安装配置
- plsql一直正在编译_使用plsql/devlop编译过程hang住案列小结