【HarmonyOS】一步解决弹框集成-快速弹框QuickDialog使用详解

一、集成的应用背景介绍

最近比较忙,除了工作节奏调整,有重点项目需要跟。业务时间,也因为参加了25年创新大赛,我们网友,组成了鸿蒙超新星研发团队,经过两个月的人员加入和磨合,现已分为三个元服务小组,两个应用小组,正式参加了比赛。

团队多来自全国各地的校园开发者,例如上海交大的博士同学。当然为保证项目贴近行业技术前沿,也邀请了来自大厂的开发者加入,帮忙进行项目框架的搭建和前沿鸿蒙技术的调研。

1、小组介绍:
其中BONNET小组负责开发的应用,《鸿社圈子》。作为主攻校园平台的鸿蒙学习资源与社群应用。
在这里插入图片描述
应用采用分层架构设计,主要分为表现层、业务逻辑层和数据层。采用模块化设计,将博客、圈子和公共功能拆分为独立模块,通过接口实现模块间通信:

在这里插入图片描述
应用拥有基础的博客功能,作为承接学习资源主要形式,文章的平台呈现。

应用中较为亮点的是,拥有类似朋友圈一样发言效果的圈子广场功能,不同于朋友圈,所有用户都可在广场中发言。

为了控制发言频率,在接入AI安全审核的基础上,我们通过将发言与成长体系的金币进行绑定,N个金币发言一次,而金币又通过签到、发文章、评论等社区行为获得X。

2、项目地址:
旨在让更多的学生开发者参与到鸿蒙开发,我们决定将项目开源,作为开源鸿蒙项目让大家了解项目细节,互相学习和进步,我们的应用地址如下:


【代码仓库】
https://gitcode.com/invite/link/06f16bb6a56d4c4484d5

3、团队开发代码规范参考:
因为是多人项目开发,所以针对鸿蒙团队开发的代码规范,我们沟通总结后,梳理了内部的代码规范文档如下:


https://developer.huawei.com/consumer/cn/blog/topic/03180782323061035

该规范文章,主要梳理和规避了常见的一些前端转鸿蒙的书写习惯问题,和应用开发书写代码的行业共识等。

二、为何要用到QuickDialog?

介绍完应用背景,接下来就是本篇文章的主角:QuickDialog。

在了解QuickDialog之前,我们需要了解目前鸿蒙里的弹框方案有哪些?

答案是:OpenCustomDialog、CustomDialog与DialogHub三种。

1、官方迭代过程为:


CustomDialog => OpenCustomDialog => DialogHub

CustomDialog 作为基础版本,依赖 UI 层的 CustomDialogController 实现弹框控制,存在强耦合局限。

OpenCustomDialog 通过 ComponentContent 节点将弹框实例托管于上下文,突破 UI 层依赖,支持纯逻辑调用。

DialogHub 基于 ArkUI 浮层机制,通过 OverlayManager 实现弹框节点的动态增删,彻底实现 UI 与逻辑解耦,支持生命周期全管控。

在这里插入图片描述

迭代过程表明,弹框的调用越来越便捷,与UI解耦,最终达到在纯逻辑中使用自定义弹出,弹框内容更新和生命周期可控,写法简洁。

弹框最重要的场景,自定义View与UI解耦的解决方案,目前共有三种方式,使用浮层(DialogHub底层原理),使用OpenCustomDialog,使用subWindow。模板代码太多,使用起来也不方便。

但是这些弹框方案局限性在于,仅支持单次弹出与关闭,无法暂存弹窗堆栈状态,难以管理弹窗模态与层级互斥关系,限制了自定义自由度。

此时QuickDialog就应运而生了。

三、QuickDialog详解

在这里插入图片描述

// 三方库中心地址:
https://ohpm.openharmony.cn/#/cn/detail/quickdialog// 三方库项目源码地址:
https://atomgit.com/qccmobileteam/QuickDialog

通过下载阅读QuickDialog的源码,我们梳理了其核心模块设计:
1、QuickDialogManager全局管理器
作为全局管理器,静态属性与方法实现全局弹窗状态管理的工具类。其核心职责是按页面维度管理弹窗控制器(QuickDialogController),实现弹窗与页面的绑定、缓存、销毁及系统事件适配,解决传统弹窗跨页面状态混乱的问题。
在这里插入图片描述

通过 currentNaviDestinationId 和 dialogControllerMap 按页面 ID 隔离弹窗,避免不同页面弹窗状态混乱,解决传统弹窗跨页面生命周期失控问题。

采用静态类而非单例,通过静态属性维护全局状态,简化调用链路(无需实例化即可使用),降低接入成本。

弹窗控制器缓存与页面导航绑定逻辑通过静态方法暴露,无需修改业务页面结构,仅需在路由拦截中注入适配代码,符合 “非侵入式” 设计理念。

基于 HashSet 存储弹窗控制器,dismissLastShowingDialog() 可按显示状态优先关闭最新弹窗,间接实现堆栈式层级管理。

2、QuickDialogBuilder内容与装饰器
在 QuickDialogManager 中,装饰器与内容的关联通过 decoratorCreateContentNodeController 方法实现,这是装饰器嵌入内容的 “桥梁”。

弹窗构建器(QuickDialogBuilder)在配置时,会将内容参数(with 方法配置)和内容 Builder 封装到 QuickDialogDecoratorParams 中,传递给装饰器。

QuickDialogManager.decoratorCreateContentNodeController(decoratorParams) 获取内容节点控制器,再通过 NodeContainer 组件将内容嵌入装饰器的样式容器中。

3、技术特点总结:
基于 Overlay 技术栈实现弹窗悬浮显示,脱离页面生命周期限制。
通过 Node 机制动态创建弹窗节点,避免侵入业务页面结构。
路由适配层针对原生 Navigation 和 HMRouter 方案分别提供拦截器与生命周期监听器,确保弹窗状态与页面导航同步。
在这里插入图片描述

4、接入方式:
通过 ohpm 安装组件:ohpm install quickdialog:

{"name": "entry","version": "1.0.0","description": "Please describe the basic information.","main": "","author": "","license": "","dependencies": {"quickdialog": "^1.0.0"},
}

在 AppAbilityStage 中配置深色模式适配,重写 onConfigurationUpdate 方法触发弹窗样式刷新。


import { AbilityStage, Configuration } from '@kit.AbilityKit';
import { QuickDialogManager } from 'quickdialog';export class AppAbilityStage extends AbilityStage {onConfigurationUpdate(newConfig: Configuration): void {QuickDialogManager.onConfigurationUpdate(newConfig)}
}

5、使用步骤:
基于 Builder 模式构建弹窗,通过 with() 传递内容参数,decorateWith() 配置装饰器样式,onEvent() 绑定交互事件,最终调用 show() 显示弹窗。示例代码如下:


// 创建控制器
const dialogController = QuickDialogManager.newBuilder(this.getUIContext(),wrapBuilder(SampleDialogBuilder),   // 内容BuilderwrapBuilder(SampleDecoratorBuilder) // 装饰器Builder(可选)
).with('title', '示例弹窗')          // 内容参数.onEvent<string>('confirm', (ctrl, param) => { ctrl.dismiss(); // 事件回调处理}).decorateWith('bgColor', '#fff')    // 装饰器参数.create();
dialogController.show(); // 显示弹窗

弹窗内容通过 @ComponentV2 声明组件,装饰器需包含 NodeContainer 嵌入内容节点。在 QuickDialog 框架中,弹窗控件 wrapperBuilder与弹窗装饰器 wrapperBuilder是实现 “内容与样式分离” 核心设计的两个关键概念,分别对应弹窗的 “业务内容层” 和 “样式装饰层”。

前者用于构建弹窗的核心业务内容,即用户实际交互的主体部分(如表单、列表、文本信息、操作按钮等)。

后者用于构建弹窗的通用样式容器,即包裹内容的装饰性结构(如边框、背景、标题栏、关闭按钮、阴影、动画等)。

示例如下:

// 内容Builder示例
@Builder
export function SampleDialogBuilder(params: QuickDialogParams) {SampleDialog({ params: params });
}
@ComponentV2
struct SampleDialog {@Param @Require params: QuickDialogParams;build() { /* 弹窗内容UI */ }
}// 装饰器Builder示例
@Builder
export function SampleDecoratorBuilder(params: QuickDialogDecoratorParams) {SampleDecorator({ params: params });
}
@ComponentV2
struct SampleDecorator {private contentNodeController = QuickDialogManager.decoratorCreateContentNodeController(this.params);build() {Column() { // 装饰器样式NodeContainer(this.contentNodeController) // 嵌入内容}}
}

针对原生 Navigation 方案,在 PageStack 拦截器与 NavDestination 中配置返回键处理。
HMRouter 方案需添加全局生命周期监听器 QuickDialogHMLifecycle,确保弹窗随页面导航正确显隐。

四、应用QuickDialog集成与其他弹框方案数据对比

对比维度QuickDialogCustomDialog(@CustomDialog)OpenCustomDialog(promptAction)DialogHub(第三方典型方案)
核心能力支持弹窗堆栈暂存、层级管理基础弹窗功能,无堆栈管理基础自定义弹窗,单次生命周期支持基础层级管理,无状态暂存
侵入性无侵入(动态创建,不修改页面结构)高侵入(需在页面内定义组件)中侵入(需绑定页面上下文)中侵入(需集成框架API到页面)
层级管理页面绑定式层级控制,规则清晰依赖页面层级,多弹窗易冲突全局层级,无页面绑定,易混乱全局堆栈,无页面隔离,易跨页干扰
状态暂存能力支持弹窗状态堆栈暂存,可中断恢复无状态暂存,关闭后状态丢失无状态暂存,关闭后销毁部分支持状态缓存,但无堆栈恢复
双向通讯能力支持弹窗与页面双向数据交互需手动实现回调,通讯链路繁琐仅支持简单结果返回,通讯能力有限支持基础通讯,扩展需自定义
复用性内容与装饰器解耦,支持跨场景复用样式与内容强耦合,复用需重复开发样式固定,复用性低支持组件复用,但样式扩展受限
系统适配性支持路由拦截(Navigation/HMRouter)、深色模式自动适配需手动适配系统配置,无路由联动无系统配置适配能力,需手动处理部分适配路由,深色模式需额外开发
性能表现轻量设计,页面级缓存释放,低内存占用随页面渲染,多弹窗易导致页面卡顿全局实例,长期使用易内存泄漏堆栈管理冗余,高并发下性能下降
开发效率链式调用+Builder模式,开发效率提升40%+需手动管理生命周期,代码冗余配置繁琐,复杂场景需大量定制需学习框架API,上手成本中等

从应用集成后的数据对比来看,QuickDialog在核心能力上实现了对传统弹窗方案的全面升级。

相比CustomDialog的高侵入性和功能局限、OpenCustomDialog的单次生命周期限制,以及DialogHub的层级管理不足,QuickDialog通过“无侵入动态创建”“页面级堆栈暂存”“内容与装饰器解耦”三大核心设计,解决了复杂弹窗场景中的层级混乱、状态丢失、复用困难等痛点。

其在系统适配性(路由联动、深色模式)和开发效率上的优势,使其更适合鸿蒙应用中多弹窗交互、状态持久化、高复用性的复杂场景,能显著降低开发维护成本并提升用户体验。

五、源码示例

在这里插入图片描述

// 导入QuickDialog相关控制器、管理器和参数类型,用于构建弹窗
import {QuickDialogContentNodeController,  // 弹窗内容节点控制器QuickDialogController,             // 弹窗控制器QuickDialogDecoratorParams,        // 弹窗装饰器参数类型QuickDialogManager,                // 弹窗管理器,用于构建和管理弹窗QuickDialogParams                  // 弹窗参数类型
} from "quickdialog"
// 导入窗口相关模块,用于处理窗口显示信息
import { window } from "@kit.ArkUI"// 入口组件,展示QuickDialog的使用示例
@Entry
export struct QuickDialogDemoPage {build() {Column() {// 渲染一个按钮,点击后展示弹窗SimpleBtn('简单装饰器使用 - 中心弹窗示例',  // 按钮文本() => {  // 点击事件回调// 使用QuickDialogManager构建弹窗QuickDialogManager.newBuilder(this.getUIContext(),  // 获取UI上下文wrapBuilder(SimplePureDialogBuilder),  // 弹窗内容构建器wrapBuilder(SimpleCenterDialogDecoratorBuilder)  // 弹窗装饰器构建器)// 设置装饰器参数:水平边距.decorateWith('testHorizontalMargin', 20)// 设置装饰器参数:边框圆角.decorateWith('testBorderRadius', 8)// 设置弹窗内容参数.with('testParam', '测试入参数222')// 构建弹窗并显示.build().show()})}.width("100%")  // 占满父容器宽度.height("100%") // 占满父容器高度.justifyContent(FlexAlign.Center)  // 子元素垂直居中}
}/*** 自定义按钮组件* @param content 按钮文本内容* @param onClickEvent 点击事件回调* @param customColor 自定义背景色(可选)*/
@Builder
export function SimpleBtn(content: ResourceStr,onClickEvent?: () => void,customColor?: ResourceColor
) {Text(content).fontSize(14)  // 字体大小.fontColor(Color.White)  // 字体颜色.textAlign(TextAlign.Center)  // 文本居中.width('calc(100% - 24vp)')  // 宽度:父容器宽度减去24vp.height(40)  // 高度40vp.margin({ left: 12, right: 12, top: 5, bottom: 5 })  // 边距.backgroundColor(customColor ?? Color.Blue)  // 背景色,默认蓝色.borderRadius(4)  // 边框圆角.onClick(() => {  // 点击事件if (onClickEvent) {onClickEvent()}})
}/*** 弹窗内容构建器* @param dialogParams 弹窗参数,用于传递数据*/
@Builder
export function SimplePureDialogBuilder(dialogParams: QuickDialogParams) {// 渲染弹窗内容组件SimplePureDialog({ dialogParams: dialogParams })
}/*** 弹窗内容组件(列表展示)*/
@ComponentV2
struct SimplePureDialog {// 接收弹窗参数(必传)@Param @Require dialogParams: QuickDialogParamsprivate testText: string = '无参数'  // 测试文本,默认"无参数"@Local fakeDataList: string[] = []  // 本地模拟数据列表// 本地状态:底部安全区域高度(避免被导航栏遮挡)@Local bottomAvoidHeight: number = DisplayUtils.provideBottomAvoidHeight()/*** 组件即将显示时调用* 初始化数据,从弹窗参数中获取传递的值*/aboutToAppear(): void {// 从弹窗参数中获取testParam并赋值if (typeof this.dialogParams.data['testParam'] == 'string') {this.testText = this.dialogParams.data['testParam']}// 生成模拟数据列表(20条)const fakeDataList: string[] = []for (let index = 0; index < 20; index++) {fakeDataList.push(this.testText)}this.fakeDataList = fakeDataList}build() {// 列表展示模拟数据List() {ForEach(this.fakeDataList,  // 数据源(value: string, index: number) => {  // 迭代渲染每个列表项ListItem() {Text(`${value} -- ${index}`)  // 显示文本和索引.fontColor(Color.Black)  // 字体颜色.padding(10)  // 内边距}})}.divider({  // 列表分隔线strokeWidth: 0.5,  // 线宽color: Color.Gray  // 颜色}).contentEndOffset(this.bottomAvoidHeight)  // 列表底部偏移(避开导航栏).scrollBar(BarState.Off)  // 隐藏滚动条.width('100%')  // 宽度占满.height('100%')  // 高度占满}
}/*** 弹窗装饰器构建器* @param decoratorParams 装饰器参数,用于配置弹窗样式*/
@Builder
export function SimpleCenterDialogDecoratorBuilder(decoratorParams: QuickDialogDecoratorParams
) {// 渲染弹窗装饰器组件SimpleCenterDialogDecorator({decoratorParams: decoratorParams})
}/*** 弹窗装饰器组件(控制弹窗样式和动画)*/
@ComponentV2
struct SimpleCenterDialogDecorator {// 接收装饰器参数(必传)@Param @Require decoratorParams: QuickDialogDecoratorParams// 弹窗内容节点控制器(管理弹窗内容)private contentNodeController: QuickDialogContentNodeController | undefined = undefined// 弹窗控制器(管理弹窗显示/隐藏)private dialogController: QuickDialogController | undefined = undefined@Local testHorizontalMargin: number = 0  // 水平边距(从装饰器参数获取)@Local testBorderRadius: number = 0  // 边框圆角(从装饰器参数获取)private readonly ANIMATE_DURATION = 300  // 动画持续时间(毫秒)private readonly START_SCALE = 0.2  // 动画起始缩放比例private readonly END_SCALE = 1      // 动画结束缩放比例@Local testScale: number = this.START_SCALE  // 缩放比例(控制动画)/*** 组件即将显示时调用* 初始化控制器和参数,设置动画和拦截器*/aboutToAppear(): void {// 创建内容节点控制器this.contentNodeController = QuickDialogManager.decoratorCreateContentNodeController(this.decoratorParams)// 获取弹窗控制器this.dialogController = this.decoratorParams.contentParams.controller// 从装饰器参数中获取圆角值if (typeof this.decoratorParams.decoratorData['testBorderRadius'] == 'number') {this.testBorderRadius = this.decoratorParams.decoratorData['testBorderRadius']}// 从装饰器参数中获取水平边距if (typeof this.decoratorParams.decoratorData['testHorizontalMargin'] == 'number') {this.testHorizontalMargin = this.decoratorParams.decoratorData['testHorizontalMargin']}// 初始化显示动画this.animateShowOrDismiss(true)// 设置显示/隐藏拦截器(控制动画时机)this.decoratorParams.decoratorShowDismissInterceptor = {// 显示拦截:执行显示动画后再触发后续操作onShowIntercept: (afterAction) => {this.animateShowOrDismiss(true, afterAction)},// 隐藏拦截:执行隐藏动画后再触发后续操作onDismissIntercept: (afterAction) => {this.animateShowOrDismiss(false, afterAction)}}}/*** 执行显示/隐藏动画* @param show 是否显示(true:显示动画;false:隐藏动画)* @param afterAction 动画结束后执行的回调*/animateShowOrDismiss(show: boolean, afterAction?: () => void) {setTimeout(() => {// 执行属性动画this.getUIContext().animateTo({duration: this.ANIMATE_DURATION,  // 动画时长curve: Curve.EaseInOut,  // 动画曲线(缓入缓出)onFinish: () => {  // 动画结束回调if (afterAction) {afterAction()}}}, () => {// 动画执行的属性变化:缩放比例this.testScale = show ? this.END_SCALE : this.START_SCALE})})}build() {Column() {// 弹窗内容容器(通过节点控制器关联内容)NodeContainer(this.contentNodeController).onClick(() => {// 点击内容区域不做处理(避免触发外部关闭)})// 宽度:父容器宽度减去两倍水平边距.width(`calc(100% - ${this.testHorizontalMargin * 2}vp)`).height(300)  // 固定高度300vp.scale({ x: this.testScale, y: this.testScale })  // 应用缩放动画.backgroundColor(Color.Yellow)  // 背景色:黄色.borderRadius(this.testBorderRadius)  // 应用圆角}.alignItems(HorizontalAlign.Center)  // 水平居中.justifyContent(FlexAlign.Center)   // 垂直居中.onClick(() => {// 点击外部区域关闭弹窗this.dialogController?.dismiss()}).backgroundColor(Color.Red)  // 外部背景色:红色.width('100%')  // 占满父容器宽度.height('100%') // 占满父容器高度}
}/*** 显示工具类* 处理窗口相关信息(如安全区域高度、窗口尺寸等)*/
export class DisplayUtils {private static bottomAvoidHeight: number = 0  // 底部安全区域高度(避开导航栏)private static mainWindow: window.Window | undefined = undefined  // 主窗口实例/*** 注入主窗口实例并计算底部安全区域高度* @param mainWindow 主窗口实例*/static injectWindowClass(mainWindow: window.Window) {DisplayUtils.mainWindow = mainWindow// 获取导航栏安全区域let navigationIndicatorAvoidArea = mainWindow.getWindowAvoidArea(window.AvoidAreaType.TYPE_NAVIGATION_INDICATOR)if (navigationIndicatorAvoidArea && navigationIndicatorAvoidArea.bottomRect) {// 转换为vp单位并设置底部安全高度DisplayUtils.injectBottomAvoidHeight(px2vp(navigationIndicatorAvoidArea.bottomRect.height))}}/*** 设置底部安全区域高度* @param height 高度(vp)*/static injectBottomAvoidHeight(height: number) {DisplayUtils.bottomAvoidHeight = height}/*** 提供底部安全区域高度* @returns 底部安全高度(vp)*/static provideBottomAvoidHeight() {return DisplayUtils.bottomAvoidHeight}/*** 提供窗口宽度* @returns 窗口宽度(vp)*/static provideWindowWidth() {return px2vp(DisplayUtils.mainWindow?.getWindowProperties()?.windowRect?.width ?? 0)}/*** 提供窗口高度* @returns 窗口高度(vp)*/static provideWindowHeight() {return px2vp(DisplayUtils.mainWindow?.getWindowProperties()?.windowRect?.height ?? 0)}
}

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

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

相关文章

当公司在你电脑上安装了IP-guard,你必须知道的事

保护公司机密的同时&#xff0c;你的隐私权何在&#xff1f;在现代企业中&#xff0c;为了保护敏感数据和知识产权&#xff0c;很多公司会选择在员工电脑上安装监控软件&#xff0c;IP-guard 就是其中常见的一款。如果你发现公司电脑安装了IP-guard&#xff0c;以下几点是你需要…

拆分TypeScript项目的学习收获:避免缓存问题,peerDependencies,引用本地项目

最近需要将工作中的一个TS包拆出一部分代码&#xff0c;以便在多个团队和项目中共享。原以为这会是一项特别简单的工作&#xff0c;但是也花了两天才大致拆成功。因此记录一下&#xff0c;也给有类似需求的同学一点经验。 所拆项目的大致功能&#xff1a;整个项目的结构大致分为…

无人机各种接头焊接方法

无人机接头的焊接直接关系到设备可靠性和飞行安全&#xff0c;以下是常见接头的焊接方法及注意事项&#xff1a;一、焊接通用原则工具准备恒温焊台&#xff08;推荐温度&#xff1a;$350 \pm 20^{\circ}\text{C}$&#xff09;含松芯焊锡丝&#xff08;直径0.8mm&#xff09;助焊…

[Linux] Linux标准块设备驱动详解:从原理到实现

Linux标准块设备驱动详解&#xff1a;从原理到实现 在Linux系统中&#xff0c;块设备是存储系统的核心组成部分&#xff0c;涵盖了硬盘、固态硬盘&#xff08;SSD&#xff09;、U盘、SD卡等各类持久化存储介质。与字符设备不同&#xff0c;块设备以固定大小的“块”为单位进行数…

什么是压力测试,有哪些方法

压力测试&#xff08;Stress Testing&#xff09;是性能测试的一种&#xff0c;旨在评估系统在极端负载条件下的表现&#xff0c;验证其稳定性、可靠性和容错能力。通过模拟超出正常范围的并发用户、数据量或请求频率&#xff0c;发现系统在高负载下的瓶颈&#xff08;如内存泄…

lua脚本在redis中执行是否是原子性?

lua脚本在redis中执行是否是原子性&#xff1f;以及是否会阻塞其他脚本的执行【客户端的请求】&#xff1f;先解答第二个问题:是的&#xff0c;保持原子执行。这也是redis中支持lua脚本执行的原因。Lua 脚本在 Redis 中是以原子方式执行的&#xff0c;在 Redis 服务器执行EVAL命…

DeepSeek文献太多太杂?一招制胜:学术论文检索的“核心公式”与提问艺术

如果我们想要完成一次学术论文检索&#xff0c;那我们可以把它想象成一次精准的“学术寻宝”。你不是在漫无目的地闲逛&#xff0c;而是一名装备精良的“学术寻宝猎人”&#xff0c;你的目标是找到深藏在浩瀚文献海洋中的“珍宝”&#xff08;高价值论文&#xff09;。1 你的寻…

Linux内存管理章节一:深入浅出Linux内存管理:从物理内存到ARM32的用户与内核空间

引言 如果说操作系统是计算机的心脏&#xff0c;那么内存管理就是它的灵魂脉络。它默默地工作在Linux内核的最底层&#xff0c;却决定着整个系统的稳定性、安全性和性能。今天&#xff0c;我们将拨开迷雾&#xff0c;深入探索Linux内存管理的核心概念&#xff0c;并结合熟悉的A…

ECMAScript (5)ES6前端开发核心:国际化与格式化、内存管理与性能

好的&#xff0c;我将根据【国际化与格式化】和【内存管理与性能】这两个主题&#xff0c;为你生成详细的课件内容&#xff0c;涵盖概念、应用和实例。 &#x1f4d7; 前端开发核心&#xff1a;国际化与格式化、内存管理与性能 1. 国际化与格式化 (Internationalization & …

3D 可视化数字孪生运维管理平台:构建 “虚实协同” 的智慧运维新范式

3D 可视化数字孪生运维管理平台通过 “物理空间数字化建模 实时数据动态映射 智能分析决策”&#xff0c;将建筑、园区、工业设施等物理实体 1:1 复刻为虚拟孪生体&#xff0c;打破传统运维 “信息割裂、依赖经验、响应滞后” 的痛点&#xff0c;实现从 “被动抢修” 到 “主…

DP-观察者模式代码详解

观察者模式&#xff1a; 定义一系列对象之间的一对多关系&#xff1b;当一个对象改变状态&#xff0c;它的依赖都会被通知。 主要由主题&#xff08;Subject&#xff09;和观察者&#xff08;Observer&#xff09;组成。 代码实现 package com.designpatterns.observer;/*** 定…

1983:ARPANET向互联网的转变

一、ARPANET早期1969年诞生的ARPANET最初还算不上互联网&#xff0c;不过在ARPANET构建之初就已经考虑了分组交换&#xff1a;1970年代的ARPANET:其实这个时候我就有疑问&#xff0c;TCP/IP是1983年1月1日更新到ARPANET的&#xff0c;但是1970年代的ARPANET已经连接全美的重要单…

自动化运维-ansible中的变量运用

自动化运维-ansible中的变量运用 一、变量命名规则 组成&#xff1a;字母、数字、下划线。必须以字母开头。 合法: app_port, web_1, varA非法: 2_var (以数字开头), my-var (包含其他字符), _private (以下划线开头) 避免使用内置关键字&#xff1a;例如 hosts, tasks, name…

深入学习并发编程中的volatile

volatile 的作用 保证变量的内存可见性禁止指令重排序1.保证此变量对所有的线程的可见性&#xff0c;当一个线程修改了这个变量的值&#xff0c;volatile 保证了新值能立即同步到主内存&#xff0c;其它线程每次使用前立即从主内存刷新。 但普通变量做不到这点&#xff0c;普通…

使用Java获取本地PDF文件并解析数据

获取本地文件夹下的PDF文件要获取本地文件夹下的PDF文件&#xff0c;可以使用Java的File类和FilenameFilter接口。以下是一个示例代码片段&#xff1a;import java.io.File; import java.io.FilenameFilter;public class PDFFileFinder {public static void main(String[] args…

吴恩达机器学习补充:决策树和随机森林

数据集&#xff1a;通过网盘分享的文件&#xff1a;sonar-all-data.csv 链接: https://pan.baidu.com/s/1D3vbcnd6j424iAwssYzDeQ?pwd12gr 提取码: 12gr 学习来源&#xff1a;https://github.com/cabin-w/MLBeginnerHub 文末有完整代码&#xff0c;由于这里的代码和之前的按…

Shell脚本一键监控平台到期时间并钉钉告警推送指定人

1. 监控需求客户侧有很多平台需要定期授权&#xff0c;授权后管理后台才可正常登录&#xff0c;为避免授权到期&#xff0c;现撰写脚本自动化监控平台授权到期时间&#xff0c;在到期前15天钉钉或其他媒介提醒。2. 监控方案2.1 收集平台信息梳理需要监控的平台地址信息&#xf…

华为HCIE数通含金量所剩无几?考试难度加大?

最近网上很火的一个梗——法拉利老了还是法拉利&#xff0c;这句话套在华为HCIE数通身上同样适用&#xff0c;华为认证中的华为数通和云计算两大巨头充斥着大家的视野里面&#xff0c;也更加广为人知&#xff0c;但随着时代的发展&#xff0c;华为认证体系的调整&#xff0c;大…

#数据结构----2.1线性表

在数据结构的学习中&#xff0c;线性表是最基础、最核心的结构之一 —— 它是后续栈、队列、链表等复杂结构的 “基石”。今天从 “是什么”&#xff08;定义&#xff09;到 “怎么用”&#xff08;基本操作&#xff09;&#xff0c;彻底搞懂线性表的核心逻辑。 一、先明确&…

2508C++,skia动画

gif动画原理 先了解一下gif动画的原理: gif动画由一系列静态图像(或叫帧)组成.这些图像按特定的顺序排列,每一帧都代表动画中的一个瞬间,帧图像是支持透明的. 每两帧之间有指定的时间间隔(一般小于60毫秒),gif播放器每渲染一帧静态图像后,即等待此时间间隔,依此逻辑不断循环渲染…