-
1.1 业务背景在移动应用开发中,用户数据的持久化存储是基础需求。无论是学习类应用的进度记录、电商应用的购物车数据、还是社交应用的用户设置,都需要实时保存并跨页面同步。应用通常包含多级页面导航(首页→列表页→详情页→操作页),用户在深层页面完成操作后,需要立即保存数据,并在返回上级页面时实时更新UI显示。随着数据量增加(可能达到数百条记录),数据读写操作频繁,若处理不当会严重影响用户体验。1.2 传统开发方式的痛点传统方式的问题: - 手动在每个页面的onPageShow中重新加载数据,代码冗余 - 页面栈复杂时容易遗漏,导致数据不同步 - 无法实现真正的"实时刷新",只能在页面显示时刷新 - 多个页面同时访问数据时可能读取到旧数据需要一套完整的跨页面状态同步机制,而不是简单的生命周期刷新。 1.3 原因分析n 架构设计缺陷 未采用单例模式管理数据,导致多个页面各自创建Preferences实例,造成资源浪费和数据不一致。缺少统一的数据管理层,业务逻辑与数据持久化逻辑耦合在UI组件中。n 同步操作阻塞主线程 直接使用同步方法进行数据读写,所有操作都在主线程执行,I/O等待时间会直接反映为界面卡顿。n 缺少数据刷新机制 仅调用put()方法,未调用flush()确保数据写入磁盘,存在数据丢失风险。n 缺乏内存缓存策略 每次读取数据都从磁盘加载,频繁的磁盘I/O操作影响性能。 1.4 解决思路&方案 (1)核心设计思想v 全局状态管理使用AppStorage实现跨页面的状态共享,悬浮组件的显示状态、位置信息、业务数据等都存储在全局状态中。通过@StorageLink装饰器实现组件与全局状态的双向绑定。v 单例模式 + 异步初始化 采用单例模式确保全局唯一的数据管理器实例,避免重复初始化。使用async/await异步初始化Preferences,确保初始化完成后再进行数据操作,避免阻塞主线程。v 内存缓存 + 异步持久化双层架构 在内存中维护数据缓存(如learnedWords数组),所有读取操作直接从内存获取,响应速度快。写入操作先更新内存缓存,再异步写入磁盘,避免阻塞UI线程。v 异步方法 + flush()确保数据安全 使用await preferences.put()异步写入数据,配合await preferences.flush()强制刷新到磁盘,确保数据不丢失。在try-catch块中捕获异常,记录错误日志便于排查问题。v 跨页面状态同步机制 结合@StorageLink + @Watch + AppStorage三件套,实现数据变化时自动通知相关页面刷新UI,无需手动在每个页面的生命周期中重新加载数据。 (2)实现要点v 单例模式管理器设计 定义DataManager类(可根据业务命名,如UserDataManager、ProgressManager等),使用私有构造函数和静态getInstance()方法实现单例。内部维护dataPreferences实例和数据内存缓存。 ```typescript export class DataManager { private static instance: DataManager | null = null private dataPreferences: preferences.Preferences | null = null private dataCache: DataItem[] = [] // 内存缓存 private constructor() {} public static getInstance(): DataManager { if (!DataManager.instance) { DataManager.instance = new DataManager() } return DataManager.instance } } ``` v 异步初始化流程 在aboutToAppear生命周期中异步初始化管理器,使用await确保初始化完成。初始化包括获取Preferences实例和加载历史数据到内存缓存。 ```typescript public async init(): Promise<void> { if (!this.context) { console.error('[DataManager] Context未设置') return } try { // 异步获取Preferences实例(存储名称根据业务自定义) this.dataPreferences = await preferences.getPreferences(this.context, 'appData') // 异步加载历史数据到内存 await this.loadData() console.info('[DataManager] 初始化成功') } catch (err) { const error = err as BusinessError console.error(`[DataManager] 初始化失败: ${error.code} - ${error.message}`) } } ``` v 异步数据加载(内存缓存) 从Preferences异步读取数据,解析JSON后存入内存数组。后续所有读取操作直接从内存获取,避免频繁磁盘I/O。 ```typescript private async loadData(): Promise<void> { try { if (this.dataPreferences) { const data = await this.dataPreferences.get('dataList', '[]') this.dataCache = JSON.parse(data as string) as DataItem[] console.info(`[DataManager] 加载了 ${this.dataCache.length} 条数据`) } } catch (err) { const error = err as BusinessError console.error(`[DataManager] 加载失败: ${error.code} - ${error.message}`) this.dataCache = [] } } ``` v 异步数据保存(关键:flush()确保写入) 先将数据序列化为JSON字符串,使用await put()异步写入,再使用await flush()强制刷新到磁盘。这是确保数据不丢失的关键步骤。 【强调】1. put()方法只是将数据写入内存缓冲区,并未真正写入磁盘 2. 系统会在合适的时机批量刷新缓冲区,但时机不确定 3. 如果应用崩溃或被杀死,缓冲区数据会丢失 4. flush()强制立即将缓冲区数据写入磁盘,确保数据安全 5. 这是官方文档中容易被忽略的关键细节 ```typescript private async saveData(): Promise<void> { try { if (this.dataPreferences) { // 步骤1:异步写入数据到内存缓冲区 await this.dataPreferences.put('dataList', JSON.stringify(this.dataCache)) // 步骤2:【关键】强制刷新到磁盘,确保数据不丢失 await this.dataPreferences.flush() console.info(`[DataManager] 保存了 ${this.dataCache.length} 条数据`) } } catch (err) { const error = err as BusinessError console.error(`[DataManager] 保存失败: ${error.code} - ${error.message}`) } } ``` 【常见错误示例】 ```typescript // ❌ 错误:忘记调用flush(),数据可能丢失 await this.dataPreferences.put('data', value) // ✅ 正确:必须调用flush()确保写入磁盘 await this.dataPreferences.put('data', value) await this.dataPreferences.flush() ``` v 业务方法实现(内存操作 + 异步持久化) 业务方法先操作内存缓存(快速响应),再调用异步保存方法持久化到磁盘(不阻塞UI)。 ```typescript public async addData(item: DataItem): Promise<boolean> { // 检查是否已存在(内存操作,快速) const exists = this.dataCache.some((d: DataItem) => d.id === item.id) if (exists) { console.info(`[DataManager] 数据已存在: ${item.id}`) return false } // 添加到内存缓存 this.dataCache.push(item) // 异步持久化(不阻塞UI) await this.saveData() console.info(`[DataManager] 添加数据成功: ${item.id}`) return true } ``` v 页面中的使用方式 在页面的aboutToAppear中初始化管理器,使用.then()处理初始化完成后的逻辑,使用.catch()处理初始化失败的情况。 ```typescript aboutToAppear(): void { const context = getContext(this) as common.UIAbilityContext dataManager.setContext(context) dataManager.init().then(() => { // 初始化完成后加载数据 this.items = this.getItems() this.isLoaded = true }).catch(() => { // 即使初始化失败也显示数据(使用默认值) this.items = this.getItems() this.isLoaded = true }) } ``` v 跨页面状态同步实现 使用AppStorage全局存储刷新计数器,配合@StorageLink和@Watch实现自动刷新。这是解决多级页面导航数据同步的完整方案。 ```typescript // 步骤1:定义全局刷新触发器(在数据管理器文件中) export class PageRefreshTrigger { static triggerRefresh(): void { const currentCount = AppStorage.get<number>('pageRefreshCount') || 0 AppStorage.set('pageRefreshCount', currentCount + 1) console.info('[PageRefreshTrigger] 触发刷新, count=' + (currentCount + 1)) } } // 步骤2:在数据变化时调用触发器(详情页中) async saveData(): Promise<void> { const success = await dataManager.addData(this.dataItem) if (success) { // 数据保存成功后,触发全局刷新 PageRefreshTrigger.triggerRefresh() promptAction.showToast({ message: '保存成功!', duration: 1000 }) } setTimeout(() => { router.back() }, 800) } // 步骤3:在需要刷新的页面中监听(列表页中) @Entry @Component struct ListPage { @State items: DataItem[] = [] @State isLoaded: boolean = false // 监听全局刷新计数器,变化时自动调用onRefreshCountChange @StorageLink('pageRefreshCount') @Watch('onRefreshCountChange') refreshCount: number = 0 // 刷新回调:重新获取数据 onRefreshCountChange(): void { if (this.isLoaded) { this.items = this.getItems() // 重新获取最新数据 console.info('[ListPage] refreshCount变化,刷新数据') } } } // 步骤4:子组件也需要响应刷新(列表组件中) @Component export struct ListComponent { @Prop items: DataItem[] = [] // 接收父组件传递的数据 @StorageLink('pageRefreshCount') refreshCount: number = 0 // 同样监听刷新 // ForEach的key必须包含动态数据,确保数据变化时重新渲染 ForEach(this.items, (item: DataItem, index: number) => { this.ItemCard(item, index) }, (item: DataItem, index: number) => `${item.id}_${item.status}_${index}`) } ``` 【关键技术点】 - AppStorage:应用级全局状态存储,所有页面共享 - @StorageLink:双向绑定全局状态,状态变化时自动更新 - @Watch:监听状态变化,触发回调函数 - 计数器模式:通过+1触发变化,比直接传递数据更高效 - ForEach的key优化:包含动态数据确保重新渲染1.5 总结² 核心思想:异步操作避免阻塞主线程,内存缓存提升读取性能,flush()确保数据安全,单例模式统一管理资源。² 单例模式管理数据:确保全局唯一实例,避免重复初始化和数据不一致² 异步初始化:使用async/await确保初始化完成后再操作,避免空指针异常² 内存缓存策略:读取操作从内存获取,写入操作异步持久化,平衡性能与安全² 必须调用flush():仅调用put()不能保证数据写入磁盘,必须配合flush()使用² 完善的错误处理:使用try-catch捕获异常,记录详细日志便于排查问题² 状态同步机制:结合@StorageLink + @Watch实现跨页面自动刷新
-
音视频管理里的视频长度128字节,太短了,建议长一些,有些名字确实很长
-
/** * 生成算法D的鉴权URL * @param string $originalUrl 原始URL * @param string $key 控制台设置的防盗链Key值 * @param int|null $pliveStartTime 伪直播开始时间(UTC时间戳,可选) * @return string 鉴权URL */ public function generateAuthUrl($originalUrl, $key, $pliveStartTime = null) { // 鉴权URL生成时间(格式: yyyyMMddHHmmss) $timestamp = date('YmdHis'); // 解析URL获取path部分 $parsedUrl = parse_url($originalUrl); $path = dirname($parsedUrl['path']); // 确保path以/结尾 if (substr($path, -1) !== '/') { $path .= '/'; } // 生成16字节的随机IV $iv = openssl_random_pseudo_bytes(16); // 构建原始加密串 $originalString = urlencode($path) . '$' . $timestamp; if ($pliveStartTime !== null) { $originalString .= '$' . $pliveStartTime; } // 使用AES-CBC-128-PKCS5Padding加密 $encrypted = openssl_encrypt( $originalString, 'AES-128-CBC', $key, OPENSSL_RAW_DATA, $iv ); // Base64编码加密结果 $encryptedBase64 = base64_encode($encrypted); // 将IV转换为十六进制 $encodedIV = bin2hex($iv); // 构建鉴权URL $authUrl = $originalUrl . '?auth_info=' . urlencode($encryptedBase64) . '.' . $encodedIV; if ($pliveStartTime !== null) { $authUrl .= '&plive=' . $pliveStartTime; } return $authUrl; }
-
使用点播VOD这个服务在哪里设置自动执行呢?比如我上传到OBS中的视频,该服务就自动进行视频封面设置,然后在存储到OBS中,或者直接覆盖源文件
-
上传功能,跨域报错这个怎么处理?has been blocked by CORS policy: No 'Access-Control-Allow-Origin' header
-
随着网络基础设施、云计算技术等不断发展,人们信息获取方式已大多从文字、图片等转变为视频直播的方式传递。 且互联网内容品质要求越来越高,巨大的网络分发需求消耗直播网络带宽越来越大,客户面临着较大的带宽成本压力。为有效地实现降本增效,让华为云视频直播普惠大众。华为云推出视频直播分时段流量包(8点-18点),是华为云针对08:00-18:00的直播闲时流量,推出的特惠资源包。现华为云开年采购季,云视频专场特惠进行中,视频直播闲时流量包8折,新用户还可领取专享610元大额礼券,可享折上9折优惠,活动时间:2023年3月1日-3月31日,更多视频服务活动请前往云视频专场~“直播CDN闲时流量包”是视频直播服务一种全新的计费方式,白天(8点-18点)单独计算流量消费,让客户增加忙闲时运营能力,不断控制并降低成本。对于带货直播、旅游直播、视频监控、在线教育、政企直播、赛事直播、健身直播等行业的直播业务,白天也有业务时段,错峰使用视频直播服务是最划算不过了!这样可以花费更少的钱使用同样的视频直播加速服务,使用分时段流量包一个月大概可以省40%的费用,实现了业务效率和用户体验双重提升。分时段流量包适用时段为北京时间00:80-18:00,白天都是大家学习、工作最繁忙的时段,相对大家的忙时视频直播正是闲时时段哦!华为云视频直播服务为行业提供高并发、低延迟、超清流畅、安全可靠的端到端直播解决方案。助力企业提高客户转化率,且拥有超低时延的直播能力,让主播和观众能够及时获得实时信息,提升直播实时体验。华为云视频直播服务全球3000+节点,全运营商覆盖确保接入质量稳定;海量带宽储备,全网带宽储备量高达100Tbps以上;高清低码,最大可节省30%以上流量和存储的实时转码功能;全天候全网健康度管理,基于服务质量智能精准调度,可靠稳定,支持千万级并发,自研拥塞控制算法与智能调度策略,保证超清、流畅的直播效果,为直播业务提供更高质量的加速服务,欢迎更多客户上华为云官网“开年采购季”云视频专场了解更多信息。[点这里]
-
疫情前的生活.那时很多人还为曾离去
-
8月5日,华为云举办TechWave音视频专题日,深度阐述华为云RTC实时音视频服务和华为云会议,爱学习教育集团、成都索贝数码科技有限公司分享了基于华为云RTC的教育、直播场景应用实践,多方共同探讨音视频前沿创新技术,以及技术如何推动音视频行业智能升级。华为云联接与协同业务总裁薛浩表示:“华为在音视频领域已经耕耘了30多年,拥有多达1000+件音视频算法专利。在视频编解码、网络传输分发等积累了深厚的技术实力;同时结合我们在5G、IT基础设施、智能终端等领域的领先优势,华为云推出了全新的实时音视频服务,希望帮助音视频行业在5G时代实现更好的视频业务体验,更多业务创新,一起享受数字化技术带给大家的便利。” 图片说明:华为云联接与协同业务总裁薛浩音视频黑科技,带来全新互动实时音视频体验当前受技术和资源等限制,视频的发展存在三大挑战:第一,场景割裂,直播、互动、会议等场景各自有一套网络,导致问题定界困难,问题修复周期长;第二,体验不佳,直播主播与观众之间秒级以上时差,存在网络抖动、卡顿、花屏等问题;第三,成本高昂,限制了应用场景普及。华为云实时音视频服务(Real-Time Communication)凭借在视频业务领域长期技术积累,快速为行业提供高并发、低延迟、高清流畅、安全可靠的全场景、全互动、全实时的音视频服务,适用于在线教育、云会议、社交文娱等场景。 图片说明:华为云视频云总监陆振宇华为云视频云总监陆振宇表示:“华为云实时音视频服务核心亮点是超低时延、一网原生、千人互动。”全场景、一张网:基于视频流融合,统一的一张网支持所有的场景业务,不再旁路直推CDN,一套SDK实现互动+超大规模直播,播放观看、连麦互动、实时交互等业务场景天然互通,无缝流转,观众随时上麦,参与互动,支持千人互动、亿级并发。全实时、低延迟:实时观看,播放时延<200ms;实时互动,双向端到端时延<200ms;实时操作,指令响应时长<30ms。高质量、强稳定:超高的视频质量,4K/8K超高清;超强的网络适应性技术,不管是在运动的汽车、高铁,还是在隧道、地下室等弱网环境下,华为云实时音视频支持在50%视频丢包,80%音频丢包情况下依然可以保持流畅的视频和通话,不卡顿,不花屏。带宽成本更优:华为云实时音视频服务具有业界领先的音视频编解码技术,连续两年获得MSU世界编码大赛冠军,提供最先进的智能感知编码、SVC分层可伸缩编码等多项技术,提升编解码效率,实现同等画质30%-40%的码率节省。更智能:AI媒体处理能力,可以实现美颜、降噪、背景虚化/替换,实时翻译等,带来更智能的音视频体验。赋能应用,助力行业创新升级华为云会议首席产品经理黄超在会上介绍了基于实时音视频服务构建的华为云会议,在技术、体验和业务形态上得到全面升级。华为云会议能提供专业的音视频通信体验,在弱网环境下也能顺畅沟通,支持千人互动,百万人观看的超大并发容量,无线投屏,白板共享,多人标注,实时翻译,自动纪要等,带来更加自然交互的文档和数据协作。黄超表示:“在网络传输上,我们做了高清低带宽的技术创新,支持视频50%的抗丢包、音频80%抗丢包;移动会议体验上,我们是业界唯一一家做到720P视频会议的厂商,且功耗能处在很低的水平;在数据会议上,我们支持H265/4K,细节还原度和和时延保持和本地一致的体验。同时,华为也在AR/VR会议上进行创新,且有望被大规模普及;另外,我们正在基于RTC网络做会议和直播的融合,比如万人直播互动。”爱学习教育集团CTO郭杏荣在《基于RTC的教育OMO发展和创新》演讲中表示,爱学习基于华为RTC构建的超低延迟线上互动课堂和基于华为云音视频实时传输的网络,具备推流、入网对抗、平台互通和录制的能力,从而进行全终端覆盖。索贝泛媒体事业部副总分享了《下一代互动直播业务分析与展望》演讲,他表示基于华为云RTC,索贝打造了多个音视频产品,形成了面向新闻、教育、综艺等全场景直播互动解决方案,广泛服务于中央台、湖南台、北京台等,在疫情期间打造无导演、无摄像、无演播厅的三无综艺。未来,华为云实时音视频服务将继续发挥云、AI和5G的协同优势,把技术积累开放出来,通过全栈技术创新,与伙伴一起使能千行百业,驱动全行业智能化升级。
推荐直播
-
华为云码道-玩转OpenClaw,在线养虾2026/03/11 周三 19:00-21:00
刘昱,华为云高级工程师/谈心,华为云技术专家/李海仑,上海圭卓智能科技有限公司CEO
OpenClaw 火爆开发者圈,华为云码道最新推出 Skill ——开发者只需输入一句口令,即可部署一个功能完整的「小龙虾」智能体。直播带你玩转华为云码道,玩转OpenClaw
回顾中 -
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中
热门标签