【鸿蒙生态共建】鸿蒙6适配-API变化与兼容(2.UI交互与基础能力篇)--《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利

作者:俩毛豆日期:2025/10/15

HarmonyOS开发者版本6.0.0(API 20)Release(鸿蒙6) 在2005年9月25日正式发布。相对于HarmonyOS 5.0版本增加了多项新能力及对已有能力的优化。同时也有部分API进行了变更。

本篇内容是《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》这本书整体内容的延续,是咱这本书读者的福利,内容以本书的示例作为基础,适配鸿蒙6过程中,所需要完成的调整。并将这些调整记录分享给大家,本篇内容主要介绍与UI交互与基础能力的鸿蒙6兼容适配。

打个广告,对本书感兴趣的同学可以点击以下链接进行购买,或者了解我的班级参加 班级共同学习,点击链接可进入(华为官方活动)

往期福利:

  1. 【页面路由导航】三步实现页面跳转的完整示例-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  2. 【鸿蒙生态共建】一文10个示例讲懂鸿蒙系统ArkTS中的null与undefined的区别与应用-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  3. 【鸿蒙生态共建】一文两表三实例讲清async函数与普通函数的区别-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  4. 【鸿蒙生态共建】一文说清基础类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  5. 【鸿蒙生态共建】一文说明兼容版本、目标版本和编译版本的区别与应用实践-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  6. 【鸿蒙生态共建】一文说清复杂类型数据的非预期输入转换与兜底-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利
  7. 【鸿蒙生态共建】鸿蒙6适配-API变化与兼容(1.基础能力篇)-《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利

1: 第7章示例源码:'px2fp'/'vp2px'/'px2vp'/'px2lpx' has been deprecated.

界页UI相关的研发中,经常性使用vp2px或px2vp等接口用于计算单位的转换。在早期的API版本中,vp2px、px2vp等接口是ArkUI的全局接口,该接口已经标为废弃,不推荐使用。当UI实例不明确时,使用默认屏幕的虚拟像素比进行转换,可能会存在转换后结果与预期不一致的情况。

在DevEco Studio 6中编译出提示警告,如下图所示:

现阶段,UIContext的vp2px、px2vp等接口为推荐的替代接口,能保证调用时UI实例已经创建,并返回正确的结果。

UIContext实例调用vp2px,px2vp等接口的方式,在API 12版本开始生效,如果是纯血鸿蒙的App,可以直接使用下面的方法进行API的升级。

  • 在UIAbility中调用:在onWindowStageCreate的方法里,执行windowStage.loadContent之后,可以通过windowStage.getMainWindowSync().getUIContext();获取UIContext实例,之后再使用UIContext实例调用vp2px或px2vp。
  • 在自定义组件中调用:通过this.getUIContext(); 获取UIContext实例,之后再使用UIContext实例调用vp2px或px2vp。
  • 在其它模块中调用:根据模块的调用关系,确定使用的UIContext实例,将该实例用为参数传入模块内,通过该实例调用vp2px或px2vp。

**2: 第7章示例:**display.getDefaultDisplaySync(),Function may throw exceptions. Special handling is required.

在鸿蒙系统中,App可以通过display.getDefaultDisplaySync()获取默认的dispaly。常见的写法为先使用一变量对获取的display存储,之后再对其相关信息进行操作,示例如下:

const ScreenInfo = display.getDefaultDisplaySync(); const displayHeight = ScreenInfo.height; const displayWidth = ScreenInfo.width;

在DevEco Studio 6.0版本以编译上述代码时会提示警告Function may throw exceptions. Special handling is required.如下图所示

将上述代码增加try catch,警告即可解除。

try { const ScreenInfo = display.getDefaultDisplaySync(); const displayHeight = ScreenInfo.height;   const displayWidth = ScreenInfo.width; } catch (error) { hilog.info(0x0000, '俩毛豆', '%{public}s', getDefaultDisplaySync error Cause: ${JSON.stringify(error)}); }

3:第8章示例:'decodeWithStream' has been deprecated.(非流式解码)

Uint8Array 是常用的数据格式,通常用于网络请求,文件读取。因为数据的组织是8位Uint的Array,里面存的是数字,在开发调试时不是很方便。

在实际的使用时,也需要对其进行解码,转为具体的字符。

decodeWithStream方法在从API version 9开始支持,从API version 12开始废弃,官方建议使用decodeToString替代,当使用decodeWithStream时,编译会报警告如下图所示。decodeToString方法在API 12开始支持,仅支持HarmonyOS NEXT的App,可以直接升级了。

下面的代码为使用decodeToString进行非流式解码的代码示例

// 原内容,俩毛豆 , 是不是不易查看 let uint8Data = new Uint8Array( [228,191,169,230,175,155,232,177,134]);

// 使用decodeToString let textDecoderOptions: util.TextDecoderOptions = { fatal: false, ignoreBOM : true } let decodeToStringOptions: util.DecodeToStringOptions = { stream: false }; let textDecoder = util.TextDecoder.create('utf-8', textDecoderOptions); let decodeToStr = textDecoder.decodeToString(uint8Data, decodeToStringOptions); console.info("tran decodeToString = " + decodeToStr); // tran decodeToString = 俩毛豆

对应的输出日志截图

**4:第9章示例:**geoLocationManager.on/off Function may throw exceptions. Special handling is required.

通过geoLocationManager.on/off('locationChange')可开启/关闭位置变化订阅,并发起定位请求。但是会产生异常, Function may throw exceptions. Special handling is required.如下所示。

规避该警告的方式,需要对geoLocationManager.on/off增加try...catch。如下代码所示。

continuousRequest() { let request: geoLocationManager.ContinuousLocationRequest= { 'interval': 1, 'locationScenario': geoLocationManager.UserActivityScenario.NAVIGATION } let locationCallback = (location:geoLocationManager.Location):void => { console.log('BULocaltionManager locationChange data: ' + JSON.stringify(location)); }; try { geoLocationManager.on('locationChange', request, locationCallback); } catch (err) { console.info("BULocaltionManager continuousRequest errCode:" + JSON.stringify(err)); } }

stopCRequest() { try { geoLocationManager.off('locationChange'); } catch (err) { console.error("errCode:" + err.code + ", message:" + err.message); } }

5: 第10章示例:'decodeWithStream' has been deprecated.(流式解码)

在研发过程中,网络通信、文件操作等场景通常需要使用数据流的方式进行数据处理。decodeWithStream方法为此提供了高效的流式解码能力,支持对分块到达的二进制数据进行实时解码。在网络数据流传输、大文件分块读取及分布式设备通信等场景中发挥关键作用,通过逐块解码的方式显著提升处理效率,降低内存消耗,确保数据处理的实时性和系统性能。

decodeWithStream方法在从API version 9开始支持,从API version 12开始废弃,官方建议使用decodeToString替代,当使用decodeWithStream时,编译会报警告如下图所示。decodeToString方法在API 12开始支持,仅支持HarmonyOS NEXT的App,可以直接升级了。

下面的代码为使用decodeToString方法及decodeToString进行流式解码的代码示例

// 下面的代码模拟从网络或文件流中分三次接收的数据块,使用decodeToString进行解码。 // 中文"俩毛豆"的UTF-8编码:[228,191,169,230,175,155,232,177,134] const dataChunks: Uint8Array[] = [ // "俩" 的完整字节 + "毛" 的部分字节 (230) new Uint8Array([228, 191, 169, 230]), // "毛" 的剩余字节 (175 155) + "豆" 的部分字节 (232) new Uint8Array([175, 155, 232]), // "豆" 的剩余字节 (177 134) new Uint8Array([177, 134]) ];

// 创建解码器配置 let textDecoderOptions: util.TextDecoderOptions = { fatal: false, // 遇到无效字节不抛出异常 ignoreBOM: true // 忽略字节顺序标记 };

// 创建解码操作配置 - 使用流模式 let decodeToStringOptions: util.DecodeToStringOptions = { stream: true // 启用流式处理 };

// 创建UTF-8解码器实例 let textDecoder = util.TextDecoder.create('utf-8', textDecoderOptions); let finalResult = ''; console.log("开始流式解码...");

// 模拟分三次接收并处理数据 for (let i = 0; i < dataChunks.length; i++) { console.log(处理第${i + 1}个数据块,字节数: ${dataChunks[i].length}); console.log([数据块${i + 1}十六进制: [${Array.from(dataChunks[i]).map(b => b.toString(16)).join(', ')}]](function toString() { [native code] }));

// 解码当前数据块 let partialResult = textDecoder.decodeToString( dataChunks[i] as Uint8Array, decodeToStringOptions );

console.log(第${i + 1}次解码结果: "${partialResult}"); console.log("---");

// 累积结果 if (partialResult) { finalResult += partialResult; } }

// 处理完成后,需要调用一次非流式解码以确保所有缓存数据被处理 let flushOptions: util.DecodeToStringOptions = { stream: false // 关闭流模式,刷新缓冲区 };

// 传入空数据来刷新解码器 let flushResult = textDecoder.decodeToString( new Uint8Array(0) as Uint8Array, flushOptions ); if (flushResult) { console.log(刷新缓冲区得到: "${flushResult}"); finalResult += flushResult; } console.log(最终解码结果: "${finalResult}"); // 输出: "俩毛豆"

执行结果日志如下:

总结:

本文针对《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者提供鸿蒙6.0兼容适配方案,重点解决5个关键API变更:1)废弃的vp2px/px2vp单位转换接口需改用UIContext实例调用;2)display.getDefaultDisplaySync()需增加try-catch异常处理;3)废弃的decodeWithStream编解码接口需升级为decodeToString;4)geoLocationManager.on/off需封装异常捕获;5)流式解码需采用新的分块处理


【鸿蒙生态共建】鸿蒙6适配-API变化与兼容(2.UI交互与基础能力篇)--《精通HarmonyOS NEXT :鸿蒙App开发入门与项目化实战》读者福利》 是转载文章,点击查看原文


相关推荐


2025年下半年加密货币市场展望:机遇与挑战并存
终端域名2025/10/14

一、核心机遇:技术融合与市场结构升级 现实世界资产(RWA)代币化加速 市场规模爆发:截至2025年6月,链上RWA总价值已超238亿美元(不含稳定币),涵盖私人信贷、美国国债、大宗商品等领域。贝莱德预测,到2030年RWA市场规模将飙升至16万亿美元,成为DeFi与传统金融融合的关键桥梁。生态主体壮大:发行机构、托管银行、投资者、区块链平台等主体快速聚集,推动资产运营、跨境支付等领域投资机遇。例如,高盛推出RWA平台,某欧洲奢侈品牌通过NFT分割限量版手表所有权,拓宽市场覆盖面。技术支撑


Redis(59)Redis的主从复制是如何实现的?
Victor3562025/10/13

Redis 的主从复制(Master-Slave Replication)是一种数据复制机制,通过它可以将一个 Redis 实例的数据复制到一个或多个从节点。这种机制可以用于数据备份、读写分离、灾难恢复等场景。以下是 Redis 主从复制的详细实现过程及其代码示例。 主从复制原理 主节点(Master):负责处理写操作(SET、DEL 等),并将数据变化同步到从节点。 从节点(Slave):负责处理读操作(GET 等),从主节点接收数据变化。 同步过程: 初次同步:从节点连接到主节点,主节点


全面解析java注解
学到头秃的suhian2025/10/11

一.注解的定义与分类 注解的概念: Java提供了一种原程序中的元素关联任何信息和任何元数据的途径和方法 JDK自带注解: @Override  代表子类重写父类的方法 @Deprecated  代表该方法已经过时 @SuppressWarning 代表忽略警告Warnings 注解的分类: 源码注解:注解只在源码中存在,编译成.class文件就不存在了编译时注解:注解在源码和.class文件中都存在(@Override,@Deprecated这些都是)运行时注解


Python 的内建函数
hubenchang05152025/10/9

#Python 的内建函数 此文档创建于 Python 3.13,可能未及时更新,请以 Python 官方文档 为准。 虽然称为内建函数,但部分 API 并不是函数,例如 object 是类。 函数名详情简介__import__查看导入模块abs查看计算绝对值aiter查看获取异步可迭代对象的迭代器all查看判断可迭代对象内容是否全部为真值anext查看获取异步迭代器的下一数据项any查看判断可迭代对象内容是否存在真值ascii查看转换为字符串,非 ASCII 字符将被转义bin查看将一


如何使用 INFINI Gateway 对比 ES 索引数据
极限实验室2025/10/8

上一篇我们通过 极限网关(INFINI Gateway) 进行了索引数据迁移,对索引迁移结果进行了初步且直观的校验,既对比索引的文档数是否一致。今天介绍个实实在在的数据比对方法,通过网关对比索引文档的内容在两个集群是否一致,此方法适用于 Elasticsearch、Easysearch、Opensearch。话不多说,就拿上次迁移的两个索引开整。 测试环境 软件版本Easysearch1.12.0Elasticsearch7.17.29INFINI Ga


从0-1建设数据仓库
DashingGuy2025/10/7

基于onedata,纯个人理解,不完善的会慢慢补充 整体流程 业务调研数据调研划分数据域构建总线矩阵数仓模型设计数仓模型开发数仓模型质量保障以及运维 一、业务调研 业务调研有几个内容要做: 确定目标和范围、收集业务需求、梳理业务流程和数据流向、输出物 1.1 确定目标和范围 明确业务目标:为什么建设数仓?数仓要解决什么问题?要实现哪些业务目标?例如提升数据分析能力、提高经营效率、支持精准营销、预测风险等。 确定数仓范围:数仓要包含哪些业务领域?哪些数据需要纳入数仓?需要支持哪些业务场景?例


在高并发场景下,如何平衡QPS和TPS的监控资源消耗?
IT橘子皮2025/10/5

在高并发场景下,平衡QPS(每秒查询数)和TPS(每秒事务数)的监控资源消耗,需要从监控策略、工具选型、资源分配及优化手段等多维度进行综合设计。以下是具体方案: 一、分层监控策略 ​轻量级采样与聚合​ ​高频QPS监控​:对简单请求(如API调用)采用低精度采样(如每10秒聚合一次),通过Prometheus的rate()函数计算QPS趋势,减少实时采集压力。 ​低频TPS监控​:对复杂事务(如支付流程)采用事件驱动记录,仅记录事务开始和结束时间戳,通过日志分析或消息队列(如Kafka)


深入理解 3D 火焰着色器:从 Shadertoy 到 Three.js 的完整实现解析
excel2025/10/4

本文由 AI 生成,结合 GLSL 原理与 Three.js 实践,旨在帮助初学者逐行理解代码,而不是仅仅“照抄能跑”。我会用直观类比、数值例子、代码注释来拆解整个火焰效果。 示例地址 一、前言:从 Shadertoy 到 Three.js Shadertoy 上有很多绚丽的着色器,但它们常常让新手望而生畏:几十行数学公式,cos/sin 嵌套,光线行进(raymarching)循环一堆看不懂的变量。 其实这些代码是有逻辑脉络的: 定义相机 → 每个像素对应一条射线 沿射线逐步前进(ray


Vue3和element plus在el-table中使用el-tree-select遇到的change事件坑
fxshy2025/10/3

1. 在el-tree-select中change事件使用 如果直接传递row, 拿到的不是最新的row的数据, 使用$index结合tableData来拿row <el-table-column prop="directory" label="所属目录树"> <template #default="scope"> <el-tree-select v-model="scope.row.areaTreeNodeId" :data="dir


贪心算法 | 每周8题(一)
小邓儿◑.◑2025/10/2

目录 0.0引言 1.0贪心算法介绍 1.1什么是贪心算法 2.0例题详解(来源力扣) 2.1 柠檬水找零 2.2将数组和减半的最少操作次数 2.3 最大数 2.4 K 次取反后最大化的数组和 2.5最长递增子序列 2.6摆动序列 2.7递增的三元子序列 2.8最长连续递增序列 3.0小结 0.0引言 从本周起,小编儿将带大家一起进入算法(^▽^)的学习当中。废话不多说,咱们从贪心走起儿😄😄😄 1.0贪心算法介绍 1.1什么是贪心算法 贪心算法(

首页编辑器站点地图

Copyright © 2025 聚合阅读

License: CC BY-SA 4.0