入口

我们从使用功能上去读取源码,通常的用法是这个样子

-> 我们设置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 源码四级缓存原理相关推荐

  1. Guava缓存器源码分析——缓存统计器

    Guava缓存器统计器实现: 全局统计器-- 1.CacheBuilder的静态成员变量Supplier<StatsCounter> CACHE_STATS_COUNTER初始化时,重载的 ...

  2. Mybatis 缓存系统源码解析

    Mybatis 缓存系统源码解析 转载于:https://juejin.im/post/5bfa50905188251d0920006c

  3. MyBatis 源码分析 - 缓存原理

    1.简介 在 Web 应用中,缓存是必不可少的组件.通常我们都会用 Redis 或 memcached 等缓存中间件,拦截大量奔向数据库的请求,减轻数据库压力.作为一个重要的组件,MyBatis 自然 ...

  4. Spring源码 - 从缓存中获取单例Bean

    # Spring源码 - 从缓存中获取单例Bean Spring版本:Spring 5.3.13-release # 1.从缓存中获取单例Bean 单实例Bean在Spring的同一个容器中只会创建一 ...

  5. 直播电商源码使用缓存,将面临什么问题

    直播电商源码使用缓存的设计包含很多技巧,设计不当将会导致严重的后果.本文将介绍缓存使用中常见的三大问题,并给出相应的解决方案. 1. 缓存穿透 在大多数直播电商源码中,缓存的使用方式如下图所示: 当业 ...

  6. RecyclerView 源码分析

    RecyclerView 源码分析 写在前面: RecyclerView 是一个越用越优雅的控件,相信大家对于 RecyclerView 的使用也已经比较熟悉了.其功能的高度解耦化,规范 ViewHo ...

  7. RecyclerView 源码分析(一):Recycler

    文章目录 前言 RecyclerView.Recycler 主要成员变量 RecycledViewPool 成员变量 主要方法 getScrapDataForType setMaxRecycledVi ...

  8. 140款Android开源优秀项目源码

    140款Android开源优秀项目源码 BeautifulRefreshLayout-漂亮的美食下拉刷新 https://github.com/android-cjj/BeautifulRefresh ...

  9. 【转】Ubuntu 14.04.3上配置并成功编译Android 6.0 r1源码

    http://www.linuxidc.com/Linux/2016-01/127292.htm 终于成功把Android 6.0 r1源码的源码编译.先上图,这是在Ubuntu中运行的Android ...

最新文章

  1. mac上mysql关闭不了了_python操作mysql数据库
  2. swift支持多线程操作数据库类库-CoreDataManager
  3. 人工智能高考511分,未来有望考上东京大学!
  4. 模拟浏览器自动化测试工具Selenium之六设置代理篇
  5. 【Python翻屏软件】英文1秒翻,水准堪比专九,这下考级有救了。
  6. [数分提高]2014-2015-2第7教学周第2次课 (2015-04-16)
  7. kafka 出现Java heap space的解决方法
  8. python 按键精灵 离线_python,PyAutoGUI,自动操作鼠标键盘,类似按键精灵
  9. 【转】%~dp0是什么意思
  10. spring异常处理实例(登录例子)
  11. SpringCloud——服务短路
  12. gridview的sort_C#教程之Gridview自动排序功能的实现
  13. 泰信科技携手浙大建高校IT运维平台
  14. ionic安装和创建项目
  15. Elasticsearch-analysis-pinyin7.6.0--可选参数详情
  16. d2lzh_pytorch安装
  17. 条件随机场(CRF)原理和实现
  18. Springboot启动报错[ main] o.s.boot.SpringApplication: Application run failed
  19. html添加背景音乐自动循环播放,html在谷歌浏览器的背景音乐怎么做才能自动循环播放...
  20. C#将查询到的数据库里面的数据输出到textbox控件

热门文章

  1. Java31 gt gt gt 2_Java Template.binding方法代碼示例
  2. php 打印行数,php/html-按行和列配置钻石数量的打印格式
  3. 山东省第十届ACM浪潮杯补题
  4. HJ浇花(牛客竞赛 约束差分)
  5. hdu 1408(高精度)坑人嫩
  6. 计算机应用大一题,大一计算机应用基础习题与答案(精选).doc
  7. 小程序开发学习(5)---实现天气预报小程序
  8. bh1750采集流程图_lcd_bh1750 通过 采集环境光照度,并在野火stm32mini板子的屏幕上显示。 SCM 机开发 272万源代码下载- www.pudn.com...
  9. mysql5.0源码安装_linux小白 mysql5.0源码安装配置
  10. plsql一直正在编译_使用plsql/devlop编译过程hang住案列小结