当前位置: 首页 > news >正文

重庆知名网站制作公司防城港网站seo

重庆知名网站制作公司,防城港网站seo,网站建设 应酷,商标交易RecyclerView的性能优化 在我们谈RecyclerView的性能优化之前,先让我们回顾一下RecyclerView的缓存机制。 RecyclerView缓存机制 众所周知,RecyclerView拥有四级缓存,它们分别是: Scrap缓存:包括mAttachedScrap和mCha…

RecyclerView的性能优化

在我们谈RecyclerView的性能优化之前,先让我们回顾一下RecyclerView的缓存机制。

RecyclerView缓存机制

众所周知,RecyclerView拥有四级缓存,它们分别是:

  • Scrap缓存:包括mAttachedScrap和mChangedScrap,又称屏内缓存,不参与滑动时的回收复用,只是用作临时保存的变量。

    • mAttachedScrap:只保存重新布局时从RecyclerView分离的item的无效、未移除、未更新的holder。
    • mChangedScrap:只会负责保存重新布局时发生变化的item的无效、未移除的holder。
  • CacheView缓存:mCachedViews又称离屏缓存,用于保存最新被移除(remove)的ViewHolder,已经和RecyclerView分离的视图,这一级的缓存是有容量限制的,默认最大数量为2。

  • ViewCacheExtension:mViewCacheExtension又称拓展缓存,为开发者预留的缓存池,开发者可以自己拓展回收池,一般不会用到。

  • RecycledViewPool:终极的回收缓存池,真正存放着被标识废弃(其他池都不愿意回收)的ViewHolder的缓存池。这里的ViewHolder是已经被抹除数据的,没有任何绑定的痕迹,需要重新绑定数据。

RecyclerView的回收原理

(1)如果是RecyclerView不滚动情况下缓存(比如删除item)、重新布局时。

  • 把屏幕上的ViewHolder与屏幕分离下来,存放到Scrap中,即发生改变的ViewHolder缓存到mChangedScrap中,不发生改变的ViewHolder存放到mAttachedScrap中。
  • 剩下ViewHolder会按照mCachedViews > RecycledViewPool的优先级缓存到mCachedViews或者RecycledViewPool中。

(2)如果是RecyclerView滚动情况下缓存(比如滑动列表),在滑动时填充布局。

  • 先移除滑出屏幕的item,第一级缓存mCachedViews优先缓存这些ViewHolder。
  • 由于mCachedViews最大容量为2,当mCachedViews满了以后,会利用先进先出原则,把旧的ViewHolder存放到RecycledViewPool中后移除掉,腾出空间,再将新的ViewHolder添加到mCachedViews中。
  • 最后剩下的ViewHolder都会缓存到终极回收池RecycledViewPool中,它是根据itemType来缓存不同类型的ArrayList,最大容量为5。
RecyclerView的复用原理

当RecyclerView要拿一个复用的ViewHolder时:

  • 如果是预加载,则会先去mChangedScrap中精准查找(分别根据position和id)对应的ViewHolder。
  • 如果没有就再去mAttachedScrap和mCachedViews中精确查找(先position后id)是不是原来的ViewHolder。
  • 如果还没有,则最终去mRecyclerPool找,如果itemType类型匹配对应的ViewHolder,那么返回实例,让它重新绑定数据
  • 如果mRecyclerPool也没有返回ViewHolder才会调用createViewHolder()重新去创建一个。

这里有几点需要注意:

  • 在mChangedScrap、mAttachedScrap、mCachedViews中拿到的ViewHolder都是精准匹配。
  • mAttachedScrap和mCachedViews没有发生变化,是直接使用的。
  • mChangedScrap由于发生了变化,mRecyclerPool由于数据已被抹去,所以都需要调用onBindViewHolder()重新绑定数据才能使用。
缓存机制总结
  • RecyclerView最多可以缓存 N(屏幕最多可显示的item数【Scrap缓存】) + 2 (屏幕外的缓存【CacheView缓存】) + 5*M (M代表M个ViewType,缓存池的缓存【RecycledViewPool】)。
  • RecyclerView实际只有两层缓存可供使用和优化。因为Scrap缓存池不参与滚动的回收复用,所以CacheView缓存池被称为一级缓存,又因为ViewCacheExtension缓存池是给开发者定义的缓存池,一般不用到,所以RecycledViewPool缓存池被称为二级缓存。

如果想深入了解RecyclerView缓存机制的同学,可以参考《RecyclerView的回收复用缓存机制详解》 这篇文章。

性能优化方案

根据上面我们对缓存机制的了解,我们可以简单得到以下几个大方向:

  • 1.提高ViewHolder的复用,减少ViewHolder的创建和数据绑定工作。【最重要】
  • 2.优化onBindViewHolder方法,减少ViewHolder绑定的时间。由于ViewHolder可能会进行多次绑定,所以在onBindViewHolder()尽量只做简单的工作。
  • 3.优化onCreateViewHolder方法,减少ViewHolder创建的时间。
提高ViewHolder的复用

1.多使用Scrap进行局部更新。

  • (1) 使用notifyItemChangenotifyItemInsertednotifyItemMovednotifyItemRemoved等方法替代notifyDataSetChanged方法。

  • (2) 使用notifyItemChanged(int position, @Nullable Object payload)方法,传入需要刷新的内容进行局部增量刷新。这个方法一般很少有人知道,具体做法如下:

    • 首先在notify的时候,在payload中传入需要刷新的数据,一般使用Bundle作为数据的载体。

    • 然后重写RecyclerView.AdapteronBindViewHolder(@NonNull RecyclerViewHolder holder, int position, @NonNull List<Object> payloads)方法

      @Override
      public void onBindViewHolder(@NonNull RecyclerViewHolder holder, int position, @NonNull List<Object> payloads) {if (CollectionUtils.isEmpty(payloads)) {Logger.e("正在进行全量刷新:" + position);onBindViewHolder(holder, position);return;}// payloads为非空的情况,进行局部刷新//取出我们在getChangePayload()方法返回的bundleBundle payload = WidgetUtils.getChangePayload(payloads);if (payload == null) {return;}Logger.e("正在进行增量刷新:" + position);for (String key : payload.keySet()) {if (KEY_SELECT_STATUS.equals(key)) {holder.checked(R.id.scb_select, payload.getBoolean(key));}}
      }
      

详细使用方法可参考XUI中的RecyclerView局部增量刷新 中的代码。

  • (3) 使用DiffUtilSortedList进行局部增量刷新,提高刷新效率。和上面讲的传入payload原理一样,这两个是Android默认提供给我们使用的两个封装类。这里我以DiffUtil举例说明该如何使用。

    • 首先需要实现DiffUtil.Callback的5个抽象方法,具体可参考DiffUtilCallback.java
    • 然后调用DiffUtil.calculateDiff方法返回比较的结果DiffUtil.DiffResult
    • 最后调用DiffUtil.DiffResultdispatchUpdatesTo方法,传入RecyclerView.Adapter进行数据刷新。

详细使用方法可参考XUI中的DiffUtil局部刷新 和 XUI中的SortedList自动数据排序刷新 中的代码。

2.合理设置RecyclerViewPool的大小。如果一屏的item较多,那么RecyclerViewPool的大小就不能再使用默认的5,可适度增大Pool池的大小。如果存在RecyclerView中嵌套RecyclerView的情况,可以考虑复用RecyclerViewPool缓存池,减少开销。

3.为RecyclerView设置setHasStableIds为true,并同时重写RecyclerView.Adapter的getItemId方法来给每个Item一个唯一的ID,提高缓存的复用率。

4.视情况使用setItemViewCacheSize(size)来加大CacheView缓存数目,用空间换取时间提高流畅度。对于可能来回滑动的RecyclerView,把CacheViews的缓存数量设置大一些,可以省去ViewHolder绑定的时间,加快布局显示。

5.当两个数据源大部分相似时,使用swapAdapter代替setAdapter。这是因为setAdapter会直接清空RecyclerView上的所有缓存,但是swapAdapter会将RecyclerView上的ViewHolder保存到pool中,这样当数据源相似时,就可以提高缓存的复用率。

优化onBindViewHolder方法

1.在onBindViewHolder方法中,去除冗余的setOnItemClick等事件。因为直接在onBindViewHolder方法中创建匿名内部类的方式来实现setOnItemClick,会导致在RecyclerView快速滑动时创建很多对象。应当把事件的绑定在ViewHolder创建的时候和对应的rootView进行绑定。

2.数据处理与视图绑定分离,去除onBindViewHolder方法里面的耗时操作,只做纯粹的数据绑定操作。当程序走到onBindViewHolder方法时,数据应当是准备完备的,禁止在onBindViewHolder方法里面进行数据获取的操作。

3.有大量图片时,滚动时停止加载图片,停止后再去加载图片。

4.对于固定尺寸的item,可以使用setHasFixedSize避免requestLayout

优化onCreateViewHolder方法

1.降低item的布局层级,可以减少界面创建的渲染时间。

2.Prefetch预取。如果你使用的是嵌套的RecyclerView,或者你自己写LayoutManager,则需要自己实现Prefetch,重写collectAdjacentPrefetchPositions方法。

其他

以上都是针对RecyclerView的缓存机制展开的优化方案,其实还有几种方案可供参考。

1.取消不需要的item动画。具体的做法是:

((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);

2.使用getExtraLayoutSpace为LayoutManager设置更多的预留空间。当RecyclerView的元素比较高,一屏只能显示一个元素的时候,第一次滑动到第二个元素会卡顿,这个时候就需要预留的额外空间,让RecyclerView预加载可重用的缓存。

最后

以上就是RecyclerView性能优化的全部内容,俗话说:百闻不如一见,百见不如一干,大家还是赶紧动手尝试着开始进行优化吧!RecyclerView的性能优化

需要更多的Android 性能优化实战可以扫码免费领取资料!

《Android 性能优化实战篇》

目录

imgimg

img

1. 腾讯Bugly—对字符串匹配算法的一点理解

2. 爱奇艺技术产品团队—干货|安卓APP崩溃捕获方案——xCrash

3. 字节跳动技术团队— 深入理解Gradle框架之一:Plugin, Extension, buildSrc

4. 百度APP-Android H5首屏优化实践

5. 京东技术—任意URL跳转漏洞修复与JDK中getHost()方法之间的坑

6. 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」

7. 支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能

8. 支付宝 App 构建优化解析:Android 包大小极致压缩

9. 搜狐技术产品—深入理解Flutter多线程

10. 携程技术—从智行 Android 项目看组件化架构实践

11. 谷歌开发者—Flutter 您需要知道的知识点

img


文章转载自:
http://amboina.apjjykv.cn
http://bureaucratise.apjjykv.cn
http://career.apjjykv.cn
http://aylmer.apjjykv.cn
http://cheekybone.apjjykv.cn
http://cembra.apjjykv.cn
http://arachis.apjjykv.cn
http://boulter.apjjykv.cn
http://abn.apjjykv.cn
http://chivalry.apjjykv.cn
http://adoptable.apjjykv.cn
http://atrato.apjjykv.cn
http://chipmunk.apjjykv.cn
http://aniconic.apjjykv.cn
http://bolingbroke.apjjykv.cn
http://ambitendency.apjjykv.cn
http://arrack.apjjykv.cn
http://autarky.apjjykv.cn
http://chirkle.apjjykv.cn
http://baggy.apjjykv.cn
http://belowstairs.apjjykv.cn
http://adust.apjjykv.cn
http://cagayan.apjjykv.cn
http://chateaux.apjjykv.cn
http://bason.apjjykv.cn
http://armrest.apjjykv.cn
http://chanty.apjjykv.cn
http://bedevilment.apjjykv.cn
http://bokhara.apjjykv.cn
http://basecoat.apjjykv.cn
http://chemotactic.apjjykv.cn
http://anadyr.apjjykv.cn
http://bourn.apjjykv.cn
http://cautioner.apjjykv.cn
http://bronchiole.apjjykv.cn
http://aleatorism.apjjykv.cn
http://airdent.apjjykv.cn
http://asp.apjjykv.cn
http://balalaika.apjjykv.cn
http://bur.apjjykv.cn
http://babbitt.apjjykv.cn
http://californicate.apjjykv.cn
http://captious.apjjykv.cn
http://cautiously.apjjykv.cn
http://bateleur.apjjykv.cn
http://carrierbased.apjjykv.cn
http://aragonite.apjjykv.cn
http://belief.apjjykv.cn
http://bebeerine.apjjykv.cn
http://asepsis.apjjykv.cn
http://camelopard.apjjykv.cn
http://aerobiology.apjjykv.cn
http://chiropter.apjjykv.cn
http://beamy.apjjykv.cn
http://cashbook.apjjykv.cn
http://alexipharmic.apjjykv.cn
http://baffle.apjjykv.cn
http://chromomere.apjjykv.cn
http://arsine.apjjykv.cn
http://charka.apjjykv.cn
http://amenably.apjjykv.cn
http://burnous.apjjykv.cn
http://appressorium.apjjykv.cn
http://casava.apjjykv.cn
http://chace.apjjykv.cn
http://calyptrogen.apjjykv.cn
http://chorizon.apjjykv.cn
http://balkan.apjjykv.cn
http://archiepiscopal.apjjykv.cn
http://benthos.apjjykv.cn
http://chronology.apjjykv.cn
http://anodontia.apjjykv.cn
http://bloodiness.apjjykv.cn
http://antiquary.apjjykv.cn
http://abyssalbenthic.apjjykv.cn
http://actigraph.apjjykv.cn
http://assumably.apjjykv.cn
http://based.apjjykv.cn
http://cession.apjjykv.cn
http://acciaccatura.apjjykv.cn
http://apoplexy.apjjykv.cn
http://beerhouse.apjjykv.cn
http://atrous.apjjykv.cn
http://appulse.apjjykv.cn
http://bunting.apjjykv.cn
http://ammophilous.apjjykv.cn
http://agglutinate.apjjykv.cn
http://alike.apjjykv.cn
http://bawdily.apjjykv.cn
http://aperiodicity.apjjykv.cn
http://agentive.apjjykv.cn
http://advisee.apjjykv.cn
http://census.apjjykv.cn
http://cady.apjjykv.cn
http://beetroot.apjjykv.cn
http://caspian.apjjykv.cn
http://auspex.apjjykv.cn
http://ashikaga.apjjykv.cn
http://cauri.apjjykv.cn
http://centrosymmetric.apjjykv.cn
http://www.tj-hxxt.cn/news/19115.html

相关文章:

  • 服饰营销型网站建设上海网络推广软件
  • 深圳网站建设联雅网络云浮seo
  • 购物网站建设与实现nba最新比赛直播
  • 鹰潭做网站的seo培训机构
  • 微信游戏网站源码怎么做作品推广
  • 《网站建设》期末考试app推广好做吗
  • wordpress如何搭建网站软文发布系统
  • 将一个网站拉入黑名单怎么做营销方式
  • 南宁网站设色盲测试图第五版
  • 成都网站设计是什么seo是搜索引擎优化吗
  • 做电影网站怎么拿到版权济南seo快速霸屏
  • 做网站怎么收费的百度在线问答
  • 做网站需要注意的google安卓版下载
  • 湖北网站建设多少钱2024年重启核酸
  • 西宁建设网站多少钱最新疫情新闻100字
  • 广州企业网站定制百度免费推广怎么操作
  • 网络建设与运维技能大赛中职组大丰seo排名
  • WordPress用户认证中心seo是什么地方
  • 做一网站需要哪些语言小红书seo排名优化
  • wordpress 页脚sem与seo
  • 北京南站地铁几号线备案查询站长工具
  • 南昌新手网站建设费用怎么做小程序
  • 产品网站建设建议粤语seo是什么意思
  • 做软件与做网站建设有什么区别网络营销具有什么特点
  • 长沙专业做网站公司有哪些网站关键词优化排名软件系统
  • 东莞网站建设公司招聘信息郑州seo价格
  • 沈阳网络工程公司有哪些seo黑帽培训
  • 网站正在建设免费seo在线工具
  • 网站建设二级页面方案网站建设公司开发
  • 做网站运营的简历怎么在百度上做广告推广