首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

RecyclerView的缓存机制和内存优化

view,应该是预留给后续开发用的....= true 时,所有的 item 都进入 scrap 中,相当于提升了复用的效率 onViewRecycled 这个可以自己设置,也可以放在 Adapter 自己扩展.一般都是自己扩展 为啥专门提这个呢...所以此时我们应该在 item 被回收进 RecyclePool 的时候去释放图片的引用.注意,此时 hasStableIds 是 false....所以,综合整个缓存机制以及我们的目标---内存优化.我们可以作如下优化: 1.如果图片大小可知,并且都比较小,那么可以设置 hasStableIds 为 true 来优化整个复用效率 2.如果图片比较大...,或者大小不可知,那么我们可以在 onViewRecycled 函数中释放图片内存.但是 hasStableIds 肯定不能是 true 了.

1.9K40
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    BaseAdapter的notifyDataSetChanged方法

    大家好,又见面了,我是你们的朋友全栈君。...child, position, y, flow, childrenLeft, selected, mIsScrap[0]); return child; } 这里只是其中的一处,如果没DataChanged为True...不多说,上源码,先看一下Adapter的源码和BaseAdapter的源码,为了简明,我删去了原本的注释: 这里的英文我就不做翻译了,友情提示一下大家,想做软件开发英语不好的抓紧学,否则就不要做了。...回头看一下ListView的setAdapter的源码有这么一段: 可以看出,内容监听器是在这里设置的,设置了一个AdapterDataSetObserver()的内容监听器。...:继续看源码: a.设置了数据发生变化的表示 mDataChanged=true; b.将没ItemCount赋值给mOldItemCount,也就是数据变化了,但是保留之前的数据数量。

    1.2K30

    RecyclerView:pre_layout:Nu1

    先记录变化之前的Item位置信息(称为pre-layout);再执行重新测量和布局(real-layout);根据重新布局后记录变化后的 Item 位置信息并对比变化之前的 Item 位置信息执行动画(称为为post-layout...pre-layout (即关闭Item动画功能),在LayoutManager.supportsPredictiveItemAnimations() 中返回 false 即可,这样给 RecyclerView 设置动画也不会有效果...mState.mRunPredictiveAnimations; 上述两处都和 mRunPredictiveAnimations 挂钩,所以我们需要找到 mRunPredictiveAnimations 被赋值为...mDataSetHasChangedAfterLayout || mAdapter.hasStableIds()); mState.mRunPredictiveAnimations = mState.mRunSimpleAnimations...所以我们明白了,pre-layout 并不是在第一次 measure 和 layout 前所存在的状态,而是在数据集发生变化的时候,所应该具有为 true 状态。

    50730

    详细聊聊 RecyclerView 缓存机制

    View int mPosition:View当前对应数据在数据源中的位置 int mOldPosition:View上次绑定的数据在数据源中的位置 long mItemId:可以判断ViewHolder是否需要重新绑定数据...返回true,ViewHolder放入mAttachedScrap中,否则会将ViewHolder回收到非scrap缓存中 LinearLayoutManager.layoutForPredictiveAnimations...如果使用GridLayoutManager建议设置为列的个数 该缓存中的ViewHolder无需重新绑定,只要ViewHolder的position和数据源中的position和itemType对应上了...4.2.2 Recycler.getScrapOrHiddenOrCachedHolderForPosition(int position) 4.2.2.1 该方法从三个地方获取缓存,获取后还需要验证是否合法...Recycler.tryBindViewHolderByDeadline(RecyclerView recyclerView, int type) 调用Adapter.bindViewHolder()方法 将ViewHolder flag设置为

    2.4K43

    日常开发踩坑记-刷新抖动

    ,复用的holder都不是原来的holder,都需要重新设置图片跟文案,所以产生了闪烁 这里,问题来了,每次刷新,后面五个holder的初始ID都是0,说明每次刷新,都新建了五个viewHolder,viewHolder...进入了缓存池,而缓存池最多容纳5个,在绑定新的数据,复用holder,还需要重新创建5个新的holder 分析到此,其实解决方案已经非常清楚了 解决方案1:把RecyclerViewPool的最大的缓存数量设置为...mRecyclerView.mAdapter.hasStableIds()) { removeViewAt(index);...stableId的话,就不会走recycledViewPool,而是进入scrap缓存 修复方案2:设置HasStableId为true class TabMainCategoryAdapter :...BaseAdapter() { init { //初始化的时候,设置stableId为true setHasStableIds(true) } 然后adapter

    79130

    工服穿戴检测算法 工装穿戴识别算法

    工服穿戴检测算法 工装穿戴识别算法利用yolo网络模型图像识别技术,工服穿戴检测算法 工装穿戴识别算法可以准确地识别现场人员是否穿戴了正确的工装,包括工作服、安全帽等。...我们将其理解为98个预测区,很粗略的覆盖了图片的整个区域,就在这98个预测区中进行目标检测。图片YOLO检测速度非常快。...public abstract boolean hasStableIds ()hasStableIds表示当数据源发生了变化的时候,原有数据项的id会不会发生变化,如果返回true表示Id不变,返回false...Android所提供的Adapter的子类(包括直接子类和间接子类)的hasStableIds方法都返回false。...————————————————版权声明:本文为CSDN博主「燧机科技」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

    49320

    郭神的抽丝剥茧心法修炼: 深剖RecyclerView

    对于源码阅读方式,我很赞成郭神在 Glide 源码分析中所说: 抽丝剥茧、点到即止。抽丝剥茧、点到即止。应该认准一个功能点,然后去分析这个功能点是如何实现的。...阅读姿势:我选择了版本为 25.3.1 的 RecyclerView,不知道什么原因,我点进 28.0.0 版本的 RecyclerView库中查看 RecyclerView.class 代码时,虽然类缩短至...= null) { // 因为是第一次设置,所以mLayout为空 // ......true 或者 Adapter 为空,我们会提前结束 onMeasure 的测量过程。...true 时机,从代码上来看,这两个属性为 true 必须存在 mItemAnimator,是否意味着子 View 动画的执行者 mItemAnimator,另外,mViewInfoStore.addToPreLayout

    1.4K20

    LevelDB:写操作

    WriteOptions& options, WriteBatch* updates) = 0; leveldb::WriteOptions 是控制写操作的参数,目前只有一个成员变量 sync 表示是否每次写完都要将日志...(MakeRoomForWrite 提供一个 force 参数表示是否强制切换新 MemTable,并触发 Compaction。正常写流程 force 为 false。)...如果第一个写请求 sync == false,那么就不要加入 sync == true 的写请求。 设置写入数据的 sequence。 释放互斥锁。这里代码保证同一时刻只有一个线程会执行写入操作。...根据参数决定是否 sync 日志。 更新 MemTable 。 获取互斥锁 。 如果 sync 失败,设置 bg_error_,后续所有写入都将失败。 清空临时合并的批量操作 。...小结 本篇文章结合代码简单介绍了 LevelDB 写操作的流程,其中,写入队列 + 合并写操作 是 LevelDB 写操作的一个设计亮点 —— 至少我个人觉得这个设计简单又实用,对写入性能的提升也应该是立竿见影的

    1.5K40
    领券