78. Harmonyos NEXT 懒加载数据源实现解析:BasicDataSource与CommonLazyDataSourceModel详解

温馨提示:本篇博客的详细代码已发布到 git : https://gitcode.com/nutpi/HarmonyosNext 可以下载运行哦!

Harmonyos NEXT 懒加载数据源实现解析:BasicDataSource与CommonLazyDataSourceModel详解


文章目录

  • Harmonyos NEXT 懒加载数据源实现解析:BasicDataSource与CommonLazyDataSourceModel详解
      • 一、核心类关系图解
      • 二、基础数据源实现(BasicDataSource)
        • 1. 监听器管理机制
        • 2. 数据变更通知体系
      • 三、业务数据源实现(CommonLazyDataSourceModel)
        • 1. 数据存储结构
        • 2. 核心操作方法
      • 四、LazyForEach工作原理
        • 1. 渲染流程
        • 2. 性能优化点
      • 五、关键代码解析
        • 1. 数据获取实现
        • 2. 数据移动通知
      • 六、开发注意事项
      • 七、扩展应用场景
      • 总结

一、核心类关系图解


二、基础数据源实现(BasicDataSource)

1. 监听器管理机制
private listeners: DataChangeListener[] = [];registerDataChangeListener(listener: DataChangeListener): void {if (!this.listeners.includes(listener)) {this.listeners.push(listener);}
}unregisterDataChangeListener(listener: DataChangeListener): void {const index = this.listeners.indexOf(listener);if (index >= 0) {this.listeners.splice(index, 1);}
}
  • 核心作用:维护监听器列表,实现观察者模式
  • 生命周期
    • 组件挂载时注册监听
    • 组件卸载时移除监听
  • 设计优势:支持多个监听器同时订阅数据变化
2. 数据变更通知体系
notifyDataReload(): void {this.listeners.forEach(listener => {listener.onDataReloaded(); // 触发LazyForEach全部刷新});
}notifyDataAdd(index: number): void {this.listeners.forEach(listener => {listener.onDataAdd(index); // 触发指定位置插入});
}
  • 通知类型对照表
    方法对应操作性能影响
    onDataReloaded全量刷新高(重建所有Item)
    onDataAdd单项插入
    onDataChange单项更新最低
    onDataDelete单项删除
    onDataMove位置交换

三、业务数据源实现(CommonLazyDataSourceModel)

1. 数据存储结构
private dataArray: T[] = [];
  • 设计特点
    • 泛型设计支持多种数据类型
    • 数组结构保证数据顺序性
    • 与BasicDataSource的originDataArray形成继承关系
2. 核心操作方法
public pushData(data: T): void {this.dataArray.push(data); // 数据压入数组this.notifyDataAdd(this.dataArray.length - 1); // 通知最后位置新增
}public clearAndPushAll(data: T[]): void {this.dataArray = [...data]; // 全量替换数据this.notifyDataReload(); // 触发全局刷新
}
  • 方法对比
    方法使用场景性能影响
    pushData增量加载优(局部更新)
    addData指定位置插入
    clearAndPushAll数据重置差(全量刷新)

四、LazyForEach工作原理

1. 渲染流程

2. 性能优化点
  • 可视区域渲染:仅创建可见项对应的组件
  • 组件复用池:缓存移出可视区域的组件实例
  • 差异更新:根据数据变化类型执行最小化更新

五、关键代码解析

1. 数据获取实现
public getData(index: number): T {return this.dataArray[index]; // 支持索引访问
}
  • 异常处理建议
    if (index >= this.totalCount()) {throw new Error("Index out of bounds");
    }
    
2. 数据移动通知
notifyDataMove(from: number, to: number): void {this.listeners.forEach(listener => {listener.onDataMove(from, to); // 触发动画效果});
}
  • 应用场景:实现拖拽排序功能时调用

六、开发注意事项

  1. 数据一致性

    • 修改数据后必须调用对应通知方法
    • 批量操作时应合并通知(如先修改数据再统一通知)
  2. 性能陷阱

    // 错误示例:循环中频繁通知
    data.forEach(item => {this.addData(item); // 每次add都会触发渲染
    });// 正确做法:批量更新
    this.dataArray = [...data];
    this.notifyDataReload();
    
  3. 内存管理

    aboutToDisappear() {this.dataSource.unregisterAllListeners();
    }
    

七、扩展应用场景

  1. 分页加载实现

    class PagingDataSource extends CommonLazyDataSourceModel {private currentPage = 0;loadNextPage() {fetchData(++currentPage).then(data => {this.pushData(...data);});}
    }
    
  2. 数据过滤功能

    filter(predicate: (item: T) => boolean) {this.dataArray = this.dataArray.filter(predicate);this.notifyDataReload();
    }
    

总结

该数据源实现方案通过:

  1. 分层设计:基础类处理监听机制,业务类专注数据管理
  2. 精准通知:根据操作类型触发最优更新策略
  3. 懒加载支持:与LazyForEach深度配合实现高性能渲染

完整构建了HarmonyOS应用的高效数据加载体系,适用于相册、商品列表、聊天记录等需要处理大量数据的场景。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/33947.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何打包数据库mysql数据,并上传到虚拟机上进行部署?

1.连接数据库,使得我们能看到数据库信息,才能进行打包上传 2. 3. 导出结果如下,是xml文件 4.可以查询每个xml文件的属性,确保有大小,这样才是真实导出 5跟着黑马,新建文件夹,并且把对应的东西放…

Springboot+mabatis增删改查,设置不可重复字段

今天又学会了一个操作,我们数据库中,可能要求一个字段名字不可以重复,我们就进行这样的操作!设计表,然后点击索引,选择字段,加入索引类型和索引方法,然后ctrlS保存!即可 如果一旦还…

C# NX二次开发:矩形阵列和线性阵列等多种方法讲解

大家好,今天讲一些关于阵列相关的UFUN函数。 UF_MODL_create_linear_iset (view source):这个函数为创建矩形阵列。 intmethodInputMethod: 0 General 1 Simple 2 Identicalchar *number_in_xInputNumber in XC direction.char *distance_xInputSpac…

嵌入式硬件: GPIO与二极管基础知识详解

1. 前言 在嵌入式系统和硬件开发中,GPIO(通用输入输出)是至关重要的控制方式,而二极管作为基础电子元件,广泛应用于信号整流、保护电路等。本文将从基础原理出发,深入解析GPIO的输入输出模式,包…

CTF--Web安全--SQL注入之报错注入

CTF–Web安全–SQL注入之报错注入 一、报错注入的概念 用户使用数据库查询语句,向数据库发送错误指令,数据库返回报错信息,报错信息中参杂着我们想要获取的隐私数据。通常在我们在页面显示中找不到回显位的时候,使用报错注入。 二…

matlab 模糊pid实现温度控制

1、内容简介 matlab162-模糊pid实现温度控制 可以交流、咨询、答疑 2、内容说明 略基于PID电加热炉温度控制系统设计 摘要 电加热炉随着科学技术的发展和工业生产水平的提高,已经在冶金、化工、 机械等各类工业控制中得到了广泛应用,并且在国民经济中占…

RabbitMq C++客户端的使用

1.RabbitMq介绍 RabbitMQ 是一款开源的消息队列中间件,基于 AMQP(高级消息队列协议)实现,支持多种编程语言和平台。以下是其核心特点和介绍: 核心特点 多语言支持 提供 Java、Python、C#、Go、JavaScript 等语言的客…

星越L_备胎更换/千斤顶使用讲解

目录 1.车辆停靠在坚实平坦的路面上。 2.打开危险警示灯、 3.设立三角指示牌 4.取出备胎及随车工具 5.使用螺栓扳手对每个螺母进行松动 6使用千斤顶抬升 7、其他 轮胎漏气或爆胎的情况,需要使用千斤顶更换备胎 1.车辆停靠在坚实平坦的路面上。 2.打开危险警示灯、

【Python 数据结构 15.哈希表】

目录 一、哈希表的基本概念 1.哈希表的概念 2.键值对的概念 3.哈希函数的概念 4.哈希冲突的概念 5.常用的哈希函数 Ⅰ、直接定址法 Ⅱ、平方取中法 Ⅲ、折叠法 Ⅳ、除留余数法 Ⅴ、位与法 6.哈希冲突的解决方案 Ⅰ、开放定址法 Ⅱ、链地址法 7.哈希表的初始化 8.哈希表的元素插…

软件测试之测试分类

1. 为什么要对软件测试进行分类 软件测试是软件⽣命周期中的⼀个重要环节,具有较⾼的复杂性,对于软件测试,可以从不同的⻆度 加以分类,使开发者在软件开发过程中的不同层次、不同阶段对测试⼯作进⾏更好的执⾏和管理测试 的分类⽅…

Devops CI/CD

Devops CI/CD DevOps 中的 CI/CD:持续集成与持续部署的深度解析一、CI/CD 基本概念(一)持续集成(二)持续部署 二、CI/CD 实施步骤(一)版本控制(二)自动化构建&#xff08…

leetcode105为什么可以root.left可以截取到前序遍历二叉树的(0,index),而不是(1,index+1)

这里以105前序和中序遍历构造二叉树为例,106同理 原因在于preoder.shift()会改变原数组,已经把preoder的第一个队头元素已经排除出去了!!! 306题中的截取后续遍历中用pop()同理

数据结构---堆栈和列

一、堆栈 1.栈堆:具有一定操作约束的线性表;(只在一端做插入删除) 2.栈的顺序存储结构: 由一个一维数组和一个记录栈顶元素位置的变量组成。定义方式如下: 3.入栈操作: 注意:&…

golang快速上手基础语法

变量 第一种,指定变量类型,声明后若不赋值,使用默认值0 package mainimport "fmt"func main() {var a int //第一种,指定变量类型,声明后若不赋值,使用默认值0。fmt.Printf(" a %d\n"…

【idea代码ai插件】利用接入硅基流动的deepseekR1的api在idea里实现问答,辅助写代码

注册硅基流动账号 https://siliconflow.cn/zh-cn/ 然后新建api密钥,这里的api密钥可以点击复制,等会输入要用 可以看到现在新注册是有额度的,你们应该是14元 模型广场这里可以调用deepseek的v3和r1,注意因为是蹭,赠…

NO.42十六届蓝桥杯备战|数据结构|算法|时间复杂度|空间复杂度|STL(C++)

数据结构 什么是数据结构 在计算机科学中,数据结构是⼀种数据组织、管理和存储的格式。它是相互之间存在⼀种或多种特定关系的数据元素的集合。 说点通俗易懂的话,数据结构就是数据的组织形式,研究的就是把数据按照何种形式存储在计算机中 …

【CSS3】化神篇

目录 平面转换平移旋转改变旋转原点多重转换缩放倾斜 渐变线性渐变径向渐变 空间转换平移视距旋转立体呈现缩放 动画使现步骤animation 复合属性animation 属性拆分逐帧动画多组动画 平面转换 作用:为元素添加动态效果,一般与过渡配合使用 概念&#x…

Keepalived高可用架构实战:从安装配置到高级应用详解

一.架构 用户空间核心组件: vrrp stack:VIP 消息通信checkers:监测 Real Serversystem call:实现 vrrp 协议状态转换时调用相关本地功能SMTP:邮件组件IPVS wrapper:生成 IPVS 规则Netlink Reflector&…

Linux:利用System V系列的-共享内存,消息队列实现进程间通信

对于管道的进程间通信方式,需要频繁的调用系统调用(read,write)。而我们今天首先要介绍的共享内存,在开辟好空间之后,便可以跳过系统调用,直接进行读写操作。 一.System V共享内存(主要) 共享内存区是最快的IPC形式。一旦这样的内…

不像人做的题————十四届蓝桥杯省赛真题解析(上)A,B,C,D题解析

题目A:日期统计 思路分析: 本题的题目比较繁琐,我们采用暴力加DFS剪枝的方式去做,我们在DFS中按照8位日期的每一个位的要求进行初步剪枝找出所有的八位子串,但是还是会存在19月的情况,为此还需要在CHECK函数…