RecyclerView缓存机制浅析
RecyclerView在Android的应用上可以说已经取代了listview,其灵活,组装式设置,多缓存机制可以适应多列表在Android开发中各种各样的需求。
对于RecyclerView的缓存机制一直都想稍微的屡下思路,简单点说RecyclerView对比listview缓存机制中就是多了两层缓存的支持,listview是两级缓存,RecyclerView为四级缓存(当然在大部分情况下是三级缓存)。
RecyclerView缓存类简介
缓存类 | 简介 |
---|---|
Recycler | 这是一个比较重要的类,此类中缓存屏幕内ViewHolder以及部分屏幕外ViewHolder,主要缓存容器为mAttachedScrap以及mChangedScrap(此容器是viewholder被标记数据已过时时,需要更新的viewholder将放置于此,也就说这个viewholder数据源已经改变)。对于屏幕外ViewHolder由mCachedViews缓存,默认情况下缓存两个。 |
ViewCacheExtension | 此类为自定义缓存类,为四级缓存中的一级,因为对此了解不太多就不做太多解释,但大部分情况下这一级缓存是没有的,当开发者没有设置自定义缓存时 |
RecycledViewPool | 这个类同样是用来缓存ViewHolder的,用于缓存离屏的ViewHolder,在mCachedViews超过缓存数量后会淘汰ViewHolder进入RecycledViewPool,同时RecycledViewPool支持多RecyclerView共享,都存在相同类型的ViewHolder可以复用,这也是性能优化的一点可以关注下。 |
RecyclerView缓存流程
对于分级可能和一些人不太一样,这里是根据进入的方法不同而分的,不必太纠结于此。在这里ViewCacheExtension如果开发者没有setViewCacheExtension的情况下是为null的,也就是说这一级缓存在默认情况下是没有的。
总结来说RecyclerView的缓存主要依赖于Recycler中的mChangedScrap、mAttachedScrap(缓存屏幕内viewholder)、mCachedViews(缓存两个屏幕外的viewholder)。RecycledViewPool(缓存屏幕外的viewholder),自定义缓存作为扩展并不一定是主要依赖的缓存类。
ok,大概的理了下缓存流程,源码就不带大家一一去看了,毕竟RecyclerView的源码又香(chou)又长的,有兴趣的童鞋可以点进去走一下流程。