Moosphan / Android-Daily-Interview

:pushpin:每工作日更新一道 Android 面试题,小聚成河,大聚成江,共勉之~

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

2019-11-05:谈谈RecyclerView的缓存机制?

MoJieBlog opened this issue · comments

  • 二级缓存。
  • Scrap做了什么?
  • Recycler做了什么?
  • 如何复用?

listview是2级缓存
Active View,Scrap view
RecyclerView的缓存分为四级:Scrap,Cache,ViewCacheExtension,RecycledViewPool
这里有篇文章,解释的很详细http://www.360doc.com/content/19/0712/11/36367108_848240455.shtml

你说二级缓存,其实recyclerView缓存细分不止二级.
我来说说我的看法
scrap viewCache recyclerPool

scrap 是当前展示的缓存, 在onlayout时候 缓存
viewCache 是屏幕外看不见的缓存, 可以吧viewCache设置大点,空间换时间 避免段距离内快速滑动卡顿
以上两种缓存是不走 createView和 onbind
recyclerPool 比较特殊他是会走 onbind的,他可以被多个recyclerView共享内部的item,实际用途是:多个recyclerView之间共享item,应用在 垂直recyclerView 内嵌水平recyclerView,或者viewpager中多个recyclerView 网易新闻首页

RecyclerView的缓存机制有四层
1,mChangedScrap和mAttachedScrap
用来缓存屏幕内的ViewHolder
2,mCachedViews(size=2先进先出)
用来缓存移除屏幕外的ViewHolder 默认size=2 如果再添加时size>2 取出第0个存入mRecyclerPool 然后移除mCachedViews第0个 再添加新的ViewHolder
3,mViewCacheExtension
自定义缓存 提供开发者 自定义缓存
4,mRecyclerPool(size=5)
recyclerPool 缓存池 以type分块每块size=5 mCachedViews空间满时添加到mRecyclerPool缓存 mCachedViews找不到ViewHoler时去mRecyclerPool获取