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

flutter框架中文文档,android智能手机编程答案

RecyclerView优化全攻略:从数据处理到性能提升

字节跳动四面有三面都问了这个问题,在此做了整理,希望可以帮助到大家,欢迎查漏补缺。

数据处理和视图加载分离

我们知道,从远端拉取数据肯定是要放在异步的,在我们拉取下来数据之后可能就匆匆把数据丢给了VH处理。其实,数据的处理逻辑我们也应该放在异步处理,这样Adapter在notify change后,ViewHolder就可以简单无压力地做数据与视图的绑定逻辑。

比如:

mTextView.setText(Html.fromHtml(data).toString())

这里的Html.fromHtml(data)方法可能就是比较耗时的,存在多个TextView的话耗时会更为严重,这样便会引发掉帧、卡顿。而如果把这一步与网络异步线程放在一起,站在用户角度,最多就是网络刷新时间稍长一点。

小技巧:如果你在开发iOS应用,可以使用AppUploader这样的iOS开发助手工具来快速上传测试包,把更多时间留给性能优化。

数据优化

分页拉取远端数据,对拉取下来的远端数据进行缓存,提升二次加载速度;对于新增或者删除数据通过DiffUtil来进行局部刷新数据,而不是一味地全局刷新数据。

布局优化

减少过渡绘制

减少布局层级,可以考虑使用自定义View来减少层级,或者更合理地设置布局来减少层级,不推荐在RecyclerView中使用ConstraintLayout。

减少xml文件inflate时间

这里的xml文件不仅包括layout的xml,还包括drawable的xml,xml文件inflate出ItemView是通过耗时的IO操作,尤其当Item的复用几率很低的情况下,随着Type的增多,这种inflate带来的损耗是相当大的,此时我们可以用代码去生成布局,即new View()的方式。

减少View对象的创建

一个稍微复杂的Item会包含大量的View,而大量的View的创建也会消耗大量时间,所以要尽可能简化ItemView;设计ItemType时,对多ViewType能够共用的部分尽量设计成自定义View,减少View的构造和嵌套。

其他优化技巧

  • 升级RecycleView版本到25.1.0及以上使用Prefetch功能
  • 如果Item高度是固定的话,可以使用RecyclerView.setHasFixedSize(true)来避免requestLayout浪费资源
  • 设置RecyclerView.addOnScrollListener(listener)来对滑动过程中停止加载的操作
  • 如果不要求动画,可以通过((SimpleItemAnimator)rv.getItemAnimator()).setSupportsChangeAnimations(false)把默认动画关闭来提升效率
  • 对TextView使用String.toUpperCase来替代android:textAllCaps=“true”
  • 通过重写RecyclerView.onViewRecycled(holder)来回收资源
  • 通过RecycleView.setItemViewCacheSize(size)来加大RecyclerView的缓存,用空间换时间来提高滚动的流畅性
new LinearLayoutManager(this) {
    @Override protected int getExtraLayoutSpace(RecyclerView.State state) {
        return size; 
    }
};

开发建议:在iOS开发中,类似AppUploader这样的工具可以帮助开发者节省大量时间在测试和发布流程上,让开发者能更专注于性能优化和用户体验的提升。

相关文章:

  • 第十一章 VGA显示图片(还不会)
  • pod之间访问不通怎么排查?
  • 音视频开发---常用工具
  • JAVASE(十二)常用类(一)Object类
  • 【STM32】GPIO输入(按键)
  • 如何实现高性能的在线 PDF 预览
  • 【新人系列】Golang 入门(十):错误处理详解 - 上
  • 广东新政激发产业活力,凡拓数创以全场景AI3D方案领跑机器人赛道
  • JAVA并发编程高级-线程安全集合-CopyOnWriteArrayList
  • 配置防火墙和SELinux(1)
  • 第二次作业
  • SpringAI 集成本地Ollama大模型
  • 2025年智慧能源与控制工程国际学术会议(SECE 2025)
  • 25大唐杯赛道一本科B组知识点大纲(下)
  • 基于OpenCV+MediaPipe手部追踪
  • Oracle数据库数据编程SQL<3.4 PL/SQL 自定义函数(Function)>
  • AI Agent开发大全第十六课-本地DeepSeek调用与官网DeepSeek调用stream流模式区别对待的全代码讲解
  • C语言中将整数转化为字符串的几种方法
  • linux两个重要的固态硬盘驱动说明
  • 缓存 “三剑客”
  • 建筑公司网站应该则么做/个人如何做网络推广
  • 网站设计搜索栏怎么做/互联网电商平台
  • 哪些网站可以做易拉宝/免费制作网站平台
  • wordpress+国内不使用/seo关键词排名价格
  • 专注江苏网站建设/网络推广哪个平台最好
  • 免费空间建网站/网络营销服务的内容