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

HarmonyOS中LazyForEach的优缺点

在鸿蒙应用开发中,对于长列表的情况,通常使用LazyForEach节省内存占用,这里主要指的是LazyForEach渲染出来的子组件仅在可视区域附近保持组件的存在,当离开可视区域很远的时候,框架销毁这些组件,节省内存。等用户再次切换到该组件,则LazyForEach会再次重建这些组件。

问题来了: 对于长列表的情形,可能dataSource中的数据量就很大,比如10000条数据,需要渲染10000个子组件,此时使用LazyForEach,在内存中真正保留的估计也就十几个,而不是10000个,节省了内存占用。 如果dataSource中的数据量很大,10000条,也是会占用内存的,这个情况,LazyForEach就无能为力了。

因为在鸿蒙应用开发中,LazyForEach 的设计确实主要针对组件实例的内存优化,而非数据源(dataSource)本身的内存占用。

🔍 核心结论

  1. LazyForEach 的优化范围: ​​仅针对组件实例的内存管理​​。它通过动态创建/销毁可视区域附近的组件(通常保留约 屏幕可见数量 + cachedCount 个组件),避免一次性创建所有子组件(如 10,000 个)导致内存爆炸。

    ✅ 组件层优化有效:内存中实际存在的组件数量仅为十几个,而非全部数据量。

  2. 数据源(dataSource)的内存问题: ​​LazyForEach 无法直接优化数据源内存​​。若 dataSource 存储了 10,000 条完整数据(如大对象数组),这些数据会始终驻留在内存中,即使对应组件已被销毁。

    ❌ 数据层优化需独立处理:这是LazyForEach 的设计边界。

⚙️ 数据源内存优化的解决方案

虽然 LazyForEach 不解决数据源内存问题,开发者可通过以下策略主动优化:

1. 分页加载数据
  • 原理:仅加载当前页数据(如每页 20 条),通过滑动触底或翻页动态加载后续数据。

  • 实现:

  • class PagedDataSource implements IDataSource {private currentPage = 1;loadNextPage() {fetchData(this.currentPage++).then(data => this.notifyDataAdd());}}    
     效果:内存中仅保留已加载的少量数据(如 200 条而非 10,000 条)。
2. 精简数据模型
  • 策略:存储最小化字段(如仅 id + title),完整数据按需从网络/数据库获取。

  • 示例:

  • interface Item {id: string;title: string; // 仅保留关键字段// 移除大字段如 content、imageUrl 等}

3. 数据懒加载(Lazy Data Fetching)
  • 实现:在itemGenerator中动态加载详细数据:

    // 仅为示例代码 
    LazyForEach(this.dataSource, (item: MinimalItem) => {const fullData = fetchFullData(item.id); // 按需加载return <ListItem data={fullData} />;})
  • 注意:需配合缓存策略避免重复请求。

4. 数据压缩与序列化
  • 对文本数据使用压缩算法(如 LZ-String)。

  • 二进制数据(如图片)存储为 ArrayBuffer 而非 Base64。

📊 优化方案对比

方案内存优化目标实现复杂度适用场景
分页加载数据源内存★★☆网络数据源
精简数据模型数据源内存★☆☆字段冗余大的数据
数据懒加载按需加载详细数据★★★详情数据大的场景
数据压缩减少单条数据内存★★☆文本/二进制数据

💎 总结

  • LazyForEach 的局限性:仅优化组件实例内存,不解决数据源内存占用。

  • 数据层优化需开发者主动处理:通过分页、精简模型、懒加载等策略降低数据源内存压力。

  • 最佳实践组件层用 LazyForEach + 数据层用分页/懒加载,双管齐下实现高性能长列表。

http://www.xdnf.cn/news/990793.html

相关文章:

  • 在QT中使用OpenGL
  • Python 元组
  • 使用spring-ai-alibaba接入大模型
  • mysql基本操作语句 增删改查基础语法速查表
  • MTK-USB模式动态设置
  • VScode安装配置PYQT6
  • MS7200+MS1824 HD转AV/S-Video/VGA/YPbPr/RGB888/BT601、656/BT1120转换器
  • Pandas时间数据处理:从基础到进阶的实战指南
  • 利用高分辨率卫星遥感数据以更智能、更快速的方式勘测评估能源开采现场
  • 第四章 文件管理
  • 软件测试用例设计总结
  • Position Embedding 有哪些方式?
  • @Indexed原理与实战
  • Java大模型开发入门 (3/15): 拥抱官方标准 - 使用OpenAI官方Java SDK调用DeepSeek
  • 航电系统之轨迹克隆技术篇
  • pyvis报错AttributeError: ‘NoneType‘ object has no attribute ‘render‘
  • python打卡day51@浙大疏锦行
  • 期权末日轮实值期权盈利未平仓怎么办?
  • 【多模态/T5】[特殊字符] 为什么视频生成模型还在用T5?聊聊模型选择的学问
  • Windows版PostgreSQL 安装 postgis扩展
  • 大数据下的分页通用架构设计:从随机IO到顺序IO
  • Gartner<Reference Architecture Brief: Data Integration>学习心得
  • 嵌入式程序存储结构
  • HW中常态化反钓鱼训练的具体战略部署
  • 【网络】每天掌握一个Linux命令 - netperf
  • 6. TypeScript 函数
  • 提升集装箱及金属包装容器制造交付效率:数字化项目管理系统的核心优势
  • 异常谋杀案--Java异常处理篇
  • 工程论文: TORL: Scaling Tool-Integrated RL
  • StackOverflowError