前言

长列表或者无限下拉列表是最常见的应用场景之一。React Native在0.43版本之前写列表需要使用ListView,ListView存在性能问题,API也不友好,所以官方在0.43版本推出了FlatList,有如下优点:

  • API更加友好和丰富;
  • 性能好很多;

使用方法

ListView

对于ListView最重要的两个属性,一个是数据源(dataSource),再一个就是列表项渲染(renderRow)。ListView可以根据不同的数据结构对应的生成普通长列表和分组长列表。

普通长列表

普通长列表使用cloneWithRows(dataBlob, rowIdentities)创建datasource,在项目中dataBlob的数据结构如下:

[{id:1},{name:'Mark'},...
]

在使用renderRow(rowData, sectionID, rowID, highlightRow)渲染列表项的时候,rowData就是数组中每一个对象。

FlatList

特别注意:

renderItem={this._rowRenderer}

如果没做手动指定传入的实参,接收时

_rowRenderer = ({ item, index }) => { };

第一个参数一点要用item接收,否则接收的属性变量都是undefined

RecyclerListView

对比

对比 ListView FlatList
1000条时内存 350M 180M
2000条时内存 / 230M
js-fps 4~6 fps 8~20 fps

js-pfs 类似于游戏的画面渲染的帧率,60 为最高。它用于判断 js 线程的繁忙程度,数值越大说明 js 线程运行状态越好,数值越小说明 js 线程运行状态越差。在快速滑动测试 ListView 的时候, js-pfs 的值一直在 4~6 范围波动,即使停止滑动,js-pfs 的值也不能很快恢复正常。而 FlatList 在快速滚动后停止,js-pfs 能够很快的恢复到正常。

内存方面,ListView 滑动到 1000 条时,已经涨到 350M。这时机器已经卡的不行了,所以没法滑到 2000 条并给出相关数据。而 FlatList 滑到 2000 条时的内存,也比 ListView 1000 条时的内存少不少。说明,FlatList 对内存的控制是很优秀的。

主观体验方面:FlatList 快速滑动至 2000 条的过程中全程体验流畅,没有出现卡顿或肉眼可见的掉帧现象。而ListView 滑动到 200 条开始卡顿,页面滑动变得不顺畅,到 500 条渲染极其缓慢,到 1000 条时已经滑不动了。

但即使是 React Native 官方支持的性能最好FlatList组件,在Android的一些机型上的表现也差强人意,特别是使用超过两年的Android手机,基本上就是到非常卡的状态了。

FlatList的原理

  • 将列表不可视区域内的视图,进行回收,并从内存中清除,下次需要时在重新创建
  • 这就需要在设备滚动时,能快速创建需要的视图,才能保证列表流畅的展示给用户
  • 视图的创建是非常昂贵的,并伴随着内存的消耗,这也就意味着FlatList或导致大量的视图重新创建以及垃圾回收

RecyclerListView

受到 Android RecyclerView 和 iOS UICollectionView 的启发

  • 仅创建可见区域的视图,这步与FlatList是一致的。
  • cell recycling,重用单元格
  • RecyclerListView 通过对不可见视图对象进行缓存及重复利用,一方面不会创建大量的视图对象,另一方面也不需要频繁的创建视图对象和垃圾回收。

RecyclerListView的滚动帧率是远大于FlatList的。FlatList在滚动时帧率波动比较严重,上手体验会发现比较卡顿且较多白屏现象。相对来说,RecyclerListView 的帧率变化相对稳定,基本都能维持到 35fps 以上,平均值在46fps 左右。

ListView vs FlatList vs RecyclerListView性能对比相关推荐

  1. Java常用消息队列原理介绍及性能对比

    消息队列使用场景 为什么会需要消息队列(MQ)? 解耦  在项目启动之初来预测将来项目会碰到什么需求,是极其困难的.消息系统在处理过程中间插入了一个隐含的.基于数据的接口层,两边的处理过程都要实现这一 ...

  2. golang连接postgresql too many client_MySQL和PostgreSQL压测性能对比

    阅读使人充实,讨论使人敏捷,写作使人精确. >>> 压测业务场景文章属于互联网社区动态类场景核心功能压测案例.至于题目涉及的MySQL和PostgreSQL之间的关系,主要为业务选型 ...

  3. php下curl与file_get_contents性能对比

    为什么80%的码农都做不了架构师?>>>    上一篇讲了 <php使用curl替代file_get_contents>, 后续贴出了curl和file_get_cont ...

  4. p40与p100训练性能对比

    深度学习训练,选择P100就对了 原文:https://yq.aliyun.com/articles/238764 摘要: 本文使用NVCaffe.MXNet.TensorFlow三个主流开源深度学习 ...

  5. php vs lua,解析LUA与PHP在WEB应用的性能对比

    解析LUA与PHP在WEB应用的性能对比是本文要介绍的内容,这几天用在WEB开发的LUA框架已经完成,框架中已包括数据库操作和模板操作的功能,能够很简单方便的应用在WEB开发上.在此时我对这个LUA框 ...

  6. Jetson Nano and VIM3硬件参数对比及目标检测性能对比

    文章目录: 1 Jetson Nano and VIM3硬件参数对比及目标检测性能对比 2 Jetson nano在yolov4目标检测性能 3 VIM在yolov3.yolov3-tiny.yolo ...

  7. MyISAM与InnoDB两者之间区别与选择,详细总结,性能对比

    1.MyISAM:默认表类型,它是基于传统的ISAM类型,ISAM是Indexed Sequential Access Method (有索引的顺序访问方法) 的缩写,它是存储记录和文件的标准方法.不 ...

  8. cimage和gdi绘图效率比较_GDI+和GDI绘图性能对比实验

    龙源期刊网 http://www.qikan.com.cn GDI+ 和 GDI 绘图性能对比实验 作者:王克茹 来源:<科技创新与应用> 2013 年第 25 期 摘 要:本文通过完全相 ...

  9. 五款主流 Linux 发行版性能对比,稳而不强?

    测试结果解读 2018 即将结束,年末正是各种基准测试对比轮番出炉的时候,通过这些报告,我们可以看到 Linux 性能的各个方面在 2018 是如何发展的.但本文的这份性能对比会更加深入 -- 将研究 ...

最新文章

  1. 支付宝的架构到底有多牛逼!还没看完我就跪了!
  2. HTTP的请求头标签 If-Modified-Since与Last-Modified 相等就是200新的请求 不等就是304没有变化
  3. java web 嵌套播放器_请教一下tableau如何嵌套进自己开发的javaweb 项目中,谢谢了...
  4. android 自定义menu背景,Android编程实现自定义系统菜单背景的方法
  5. [渝粤教育] 沈阳农业大学 有机化学 参考 资料
  6. python基本语法:字典
  7. 基于生成对抗的知识图谱零样本关系学习 AAAI2020
  8. sql server 面试_SQL Server审核面试问题
  9. 让IE支持Css3属性(圆角、阴影、渐变)
  10. Django2.1配置xadmin2.0
  11. 卡巴斯基破解版 KISV8.0.0.432 Beta 江南混混汉化特别版
  12. 微信加好友,提示操作过于频繁 ,有什么办法解决
  13. python学习群发邮件
  14. python大数据运维工程师待遇_大数据运维工程师具体是做什么的?
  15. i春秋百度杯CTF比赛2016年12月场writeup
  16. 2021-2027中国COP注射器市场现状及未来发展趋势
  17. android之图片选择器ImageSelector的使用
  18. 机器人搏击大赛冠军_喜报|2019中国智能机器人格斗大赛,石大学子在轮式自主格斗A、B组中包揽双冠...
  19. python文本转女生语音
  20. TLS双向认证之生成双端证书信息

热门文章

  1. Android开发笔记(十七)GIF动画的实现GifAnimation
  2. Nginx负载均衡配置+keepalived高可用
  3. 使用git上传项目到github
  4. linux下MySQL使用方法
  5. react-redux学习笔记
  6. 译 | 像使用一台主机一样管理集群
  7. 用c语言实现strncmp,strncat,memset, memcmp
  8. SAP MM ‘Pricing Date Control‘字段的理解
  9. hdu 1861 游船出租 tag:模拟
  10. android通话流程浅析RIL层