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

鸿蒙开发第3篇__大数据量的列表加载性能优化

列表 是最常用到的组件

一 ForEach

渲染控制语法————Foreach
Foreach的作用

  • 遍历数组项,并创建相同的布局组件块
  • 在组件加载时, 将数组内容数据全部创建对应的组件内容, 渲染到页面上
const swiperImage: Resource[] ={
	$r("app.media.ic_home"),
	$r("app.media.ic_coupons"),
	$r('app.media.ic_internal_price')
};
Swiper(){
	Foreach(swiperImage, (item: Resource) =>{
		Image(item)
		  .width("100%")
		  ...
	}, (item: Resource) => JSON.stringify(item))
}

二. LazyForEach

渲染控制语法 ————LazyForeach

  • 使用 LazyForeach时,框架会根据滚动容器可视区域按需创建组件, 当组件滑出可视区域外时,框架会进行组件销毁回收以降低内存占用, 提高首次加载的速度
  • 不可滚动容器使用LazyForeach, 其会退化为Foreach, 全部创建内容
  • 使用的数据源需要继承 IDatasource 接口
WaterFlow(){
	LazyForEach(this.datasource, (item: ProductBean) =>{
		FlowItem(){
			FlowItemComponent({item: item})
		}
	}, (item: ProductBean) => JSON.stringify(item))
}

三 List列表

List 支持懒加载能力

List(){
	ForEach(mainViewModel.getSettingListData(),
	(item: ItemData) =>{
		ListItem(){
		  this.settingCell(item)
		}
	},item => item.toString())
}.divider({...})

四 Grid网格布局

实现二维布局, 可以根据rowsTemplate, columnTemplate 设置行数和列数

 Grid(){
	ForEach(mainViewModel.getFirstGridData(),
		(item: ItemData) =>{
				GridItem(){
						Column(){
								Image(item.img)
								Text(item.title)
						}
					}
		}, item => item.toString())
}.rowsTemplate("1fr 1fr")
.columnsTemplate("1fr 1fr  1fr 1fr")
.rowsGap(12)
.columnsGap(8)

网络显示如下图 方框所示
在这里插入图片描述

五 性能优化

在大数据量情况下, 例如超过10万
使用ForEach加载 List, 会出现白屏, 使用LazyForEach 不会白屏。
ForEach为什么会有性能问题, 假设有1万条数据, 手机的可视区域只能显示5条, 剩余9千多条也会全量加载,ForEach的加载原理就是这样。
LazyForEach实现了按需加载, 减少了页面首次启动时一次性加载数据的时长, 减少了内存峰值。

要对性能优化, 就需要引入指标来进行分析、比较
在这里插入图片描述
我们可以从4方面进行优化

  1. 优化1 懒加载
  2. 优化2 缓存列表项
  3. 优化3 组件复用
  4. 优化4 布局优化
    在这里插入图片描述

在这里插入图片描述
注意: 通过设置cachedCount 来指定缓存数量。
不同cachedCount 对列表滑动帧率的影响
一般而言, 缓存的cachedCount= n/2(n为一屏显示的列表数) 的时候, 效果较好。
如果列表项中需要显示网络数据, 而网络数据加载较慢,为了提升列表信息的浏览效率和浏览体验, 我们可以适当的多设置一些缓存数量;
如果列表中需要加载一些大图或者视频等, 占用的内存较大,为了减少内存的占用, 我们需要适当地减少缓存数量的设置 (cachedCount < n/2).


在这里插入图片描述


在这里插入图片描述
在这里插入图片描述

相关文章:

  • Linux学习笔记(centOS)—— 文件系统
  • Windows平台git clone文件路径太长报错
  • 命令行参数和环境变量
  • C++ STL->list模拟实现
  • 【C++】实现Date类的各种运算符重载
  • 【机器学习笔记】 9 集成学习
  • 第73左侧菜单实现
  • 【NI-DAQmx入门】调整数据记录长度再进行数据处理
  • 第二节 zookeeper基础应用与实战
  • 多维时序 | Matlab实现TCN-RVM时间卷积神经网络结合相关向量机多变量时间序列预测
  • C 语言 devc++ 使用 winsock 实现 windows UDP 局域网发送消息
  • 设计模式之结构型模式
  • 通过 Prometheus 编写 TiDB 巡检脚本(脚本已开源,内附链接)
  • TCP/IP C 语言实现单个客户端和服务端 TCP 通信
  • 【FPGA开发】HDMI通信协议解析及FPGA实现
  • HiveSQL——共同使用ip的用户检测问题【自关联问题】
  • CVE-2022-25487 漏洞复现
  • 排序算法---计数排序
  • 安全基础~通用漏洞5
  • 【Spring2】从重构HelloWorld看Spring的作用
  • 十二届上海市委第六轮巡视全面进驻,巡视组联系方式公布
  • 李乐成任工业和信息化部部长
  • 郭向阳任广东省公安厅分管日常工作副厅长(正厅级)
  • 俄罗斯纪念卫国战争胜利80周年阅兵式首次彩排在莫斯科举行
  • 交行一季度净利253.72亿元增1.54%,不良率微降
  • 打造沪派水乡的“湿意”,上海正在保护营造一批湿地空间