HarmonyOS 實戰:6 種實現實時數據更新的方案全解析(含完整 Demo)

在這里插入圖片描述

摘要

在當下的應用開發中,用戶體驗越來越依賴“實時性”。消息要第一時間送達、訂單狀態要立刻刷新、數據變化不能延遲……這些需求推動了“實時數據更新”成為應用的必備功能。在鴻蒙系統(HarmonyOS)中,我們既可以用系統內置的數據能力(DataAbility、DataBus),也可以用事件驅動(發布訂閱)、后臺服務,甚至和遠程服務器保持 WebSocket 長連接。不同的方案適合不同的場景,本文會帶大家從原理到實戰,結合代碼一步步拆解。

引言

假設你正在做一個電商應用:用戶提交訂單后希望能立刻看到訂單狀態更新;商家端改價后,用戶端價格立刻刷新;再比如做一個股票類 App,行情數據需要秒級同步。這類場景在鴻蒙中都可以實現。
那怎么做呢?常見的方式包括:

  • DataAbility:適合模塊內、應用間的數據共享和通知。
  • 發布-訂閱(Publish-Subscribe):輕量、解耦,常用在組件交互。
  • 后臺服務(ServiceAbility):適合長期任務,比如輪詢服務器。
  • WebSocket:和后端保持實時通信。
  • DataBus:模塊間的消息和數據同步。

接下來,我們用幾個實際場景來展開。

用發布-訂閱實現應用內實時更新

發布-訂閱是應用內實時通知最常見的方式,模塊之間不用直接耦合,只要關心“訂閱什么事件”和“發布什么事件”即可。

場景:聊天應用消息刷新

用戶在 A 頁面發了一條消息,B 頁面需要立刻刷新列表。
這時可以用事件分發,避免兩個頁面硬編碼依賴。

Demo 代碼

// 定義一個事件 key
const EVENT_MESSAGE_UPDATE = "chat_message_update";// 發布者(比如在發送消息后觸發)
import eventEmitter from '@ohos.events.emitter';function sendMessage(content: string) {// 假裝這里調用了服務端 API 成功console.info("發送消息成功: " + content);// 發布事件,通知其他模塊刷新let eventData = {data: {message: content}};eventEmitter.emit({ eventId: 1, eventName: EVENT_MESSAGE_UPDATE }, eventData);
}
// 訂閱者(比如消息列表頁面)
import eventEmitter from '@ohos.events.emitter';function registerMessageObserver() {eventEmitter.on({ eventId: 1, eventName: "chat_message_update" }, (data) => {console.info("收到消息更新: " + JSON.stringify(data));// 在這里更新 UI,比如追加到聊天列表});
}

說明

  • eventEmitter.emit 是發布事件。
  • eventEmitter.on 是訂閱事件。
  • 事件 ID 和事件名需要保持一致,不然收不到。

這樣就能做到:一個頁面發消息,另一個頁面自動更新。

用后臺服務定期獲取數據

有些場景下我們不依賴消息推送,而是主動去服務器拉取,比如天氣數據、股票行情。這里就要用到 ServiceAbility。

場景:股票行情定時刷新

后臺服務定時請求行情接口,前臺 UI 通過事件接收并刷新。

Demo 代碼

// MyStockServiceAbility.ets
import UIAbility from '@ohos.app.ability.ServiceExtensionAbility';
import eventEmitter from '@ohos.events.emitter';export default class MyStockServiceAbility extends UIAbility {onCreate() {console.info("Stock Service started");this.startPolling();}startPolling() {setInterval(async () => {// 模擬請求股票接口let price = (Math.random() * 100).toFixed(2);console.info("拉取到最新股價: " + price);// 推送事件給 UIeventEmitter.emit({ eventId: 2, eventName: "stock_price_update" }, {data: { price }});}, 5000); // 每 5 秒刷新一次}
}
// 前臺頁面訂閱股價更新
import eventEmitter from '@ohos.events.emitter';function registerStockListener() {eventEmitter.on({ eventId: 2, eventName: "stock_price_update" }, (data) => {console.info("UI 收到最新股價: " + data.data.price);// 在這里刷新界面});
}

說明

  • ServiceAbility 適合后臺運行,不會被 UI 銷毀影響。
  • setInterval 定時拉取數據,實際項目中可換成真正的 HTTP 請求。
  • UI 層和后臺服務解耦,只靠事件通信。

用 WebSocket 做實時推送

如果是消息、通知、行情這類高實時性場景,WebSocket 是更合適的。客戶端和服務端保持長連接,一旦有數據,立刻推送。

場景:股票行情實時推送

相比上面的輪詢方式,WebSocket 更節省資源,延遲更低。

Demo 代碼

import WebSocket from '@ohos.net.webSocket';function connectWebSocket() {const ws = new WebSocket("ws://echo.websocket.org"); // 測試用 echo 服務ws.onopen = () => {console.info("WebSocket 已連接");ws.send("訂閱股票行情");};ws.onmessage = (msg) => {console.info("收到行情推送: " + msg.data);// 在這里更新 UI};ws.onerror = (err) => {console.error("WebSocket 錯誤: " + JSON.stringify(err));};ws.onclose = () => {console.info("WebSocket 已關閉");};
}

說明

  • onopen:連接成功回調。
  • onmessage:收到消息立刻更新 UI。
  • onerror / onclose:處理異常和斷開。
  • 服務端可以隨時推送數據,不需要客戶端輪詢。

QA 階段

Q1:發布訂閱和 DataAbility 有什么區別?
發布訂閱更輕量,適合應用內事件;DataAbility 更像數據庫,適合做數據共享和存儲。

Q2:后臺服務會不會被系統殺掉?
在 HarmonyOS 中,ServiceAbility 默認是后臺長駐的,但如果內存緊張,系統也可能回收。可以通過合理的調度策略來增強存活率。

Q3:WebSocket 和輪詢哪個好?
實時性要求高 → WebSocket;數據變化頻率低且服務端不支持推送 → 定時輪詢。

總結

鴻蒙應用實現實時數據更新,有多種方案可選:

  • 發布訂閱:模塊間解耦、事件驅動。
  • 后臺服務:適合定時拉取或長時間運行的邏輯。
  • WebSocket:最適合實時推送場景。
  • DataAbility / DataBus:適合模塊間或跨應用的數據共享。

開發中往往不是單一選擇,而是組合使用。比如:消息系統用 WebSocket,配合事件分發到 UI;行情類數據用后臺服務定時補償,避免丟消息。
這樣才能既保證實時性,又保證應用穩定。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/94130.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/94130.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/94130.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

第十六屆藍橋杯青少組C++省賽[2025.8.10]第二部分編程題(4、矩陣圈層交錯旋轉)

參考程序&#xff1a;#include <bits/stdc.h> using namespace std;const int MAXN 105; int a[MAXN][MAXN];int main() {int n;if (!(cin >> n)) return 0;for (int i 0; i < n; i)for (int j 0; j < n; j)cin >> a[i][j];int layers n / 2; // 每…

AI供應鏈情報預警 | 惡意Py包偽裝AI框架庫開展數據竊密及應用劫持攻擊

AI供應鏈情報概述近日&#xff08;18th Aug. , 2025&#xff09;&#xff0c;懸鏡安全情報中心在Python官方倉庫中捕獲1起偽裝成知名AI框架庫pytensor&#xff08;https://pypi.org/project/pytensor&#xff09;的組件投毒事件。在北京時間8月18日凌晨&#xff0c;投毒者連續發…

AI需要防火墻,云計算需要重新構想

Akamai創始人Tom Leighton欲終結云膨脹&#xff0c;從內到外守護AI安全 Akamai創始人Tom Leighton 當前超大規模云服務商主導著企業IT市場&#xff0c;鮮有人敢挑戰云計算經濟模式、AI基礎設施和網絡安全架構的現狀。但Akamai聯合創始人兼CEO Tom Leighton正是這樣的挑戰者。他…

線段樹詳解【數據結構】

簡介 線段樹是一種應用極其廣泛&#xff0c;使用范圍較廣并且非常知名的樹形數據結構&#xff0c;主要用于進行區間操作&#xff0c;如區間修改&#xff0c;區間查詢等。這種數據結構唯一的不足就是巨大的代碼量&#xff0c;因此處理一些較簡單的問題時建議用樹狀數組。 原理…

Maven 入門與進階:聚合、繼承與生命周期詳解

Maven 是 Java 項目管理的核心工具&#xff0c;其強大的依賴管理、項目構建和模塊化設計能力&#xff0c;極大地提升了開發效率。本文將深入探討 Maven 的 聚合&#xff08;Multi-module&#xff09;、繼承&#xff08;Inheritance&#xff09; 和 生命周期&#xff08;Lifecyc…

手搓MCP客戶端動態調用多MCP服務,調用哪個你說了算!

01 引言 前兩天&#xff0c;有個粉絲朋友咨詢MCP服務如何動態調用&#xff0c;動態加載MCP服務的鏈接&#xff1f;我們都知道MCP客戶端可以配置多個MCP服務的地址&#xff1a; spring.ai.mcp.client.sse.connections.server1.urlhttp://localhost:xxxx spring.ai.mcp.client.ss…

Go語言中的優雅并發控制:通道信號量模式詳解

在Go語言的并發編程中&#xff0c;“通過通信共享內存”的設計哲學貫穿始終。當面對高并發場景時&#xff0c;無限制創建goroutine可能導致資源耗盡、CPU過載等問題&#xff0c;通道信號量模式&#xff08;Channel Semaphore Pattern&#xff09; 正是一種基于Go通道特性的優雅…

鴻蒙 NEXT開發中輕松實現人臉識別功能

大家好&#xff0c;我是 V 哥。 今天給大家介紹在 HarmonyOS 原生鴻蒙開發中&#xff0c;實現人臉識別功能&#xff0c;這個功能在常用的 APP 開發中上鏡率還是很高的&#xff0c;在傳統的 Android 或 iOS 開發中&#xff0c;通常我們要借助第三方庫來實現&#xff0c;而在鴻蒙…

華為開發者空間訓練營-優秀作品公布

排名標題總分獎品1手把手教你開發一個地區智能查詢MCP&#xff0c;賦能地理位置類MCP服務的“零輸入”無感交互95華為 freebuds 6i 藍牙耳機2基于華為開發者空間云主機DeepSeek助力電商企業AI海報文案驅動的最佳實踐落地 94華為 freebuds 6i 藍牙耳機32小時基于華為開發者空間和…

基于Python與Tkinter開發的微博多功能自動化助手

文章目錄 摘要 1. 背景與意義 2. 需求分析 3. 核心架構設計 3.1. 技術選型 3.2. 核心思想:UI與邏輯分離的異步架構 4. 深度模塊化剖析 4.1. 微博核心API交互模塊 4.2. 健壯性設計:代理與重試機制 4.3. GUI界面模塊 (WeiboApp 類) 4.4. 異步任務處理模塊 5. 難點分析與解決方案…

效果驅動復購!健永科技RFID牛場智能稱重項目落地

近日&#xff0c;北京某養殖企業持續下單電子耳標識讀器&#xff0c;在牛場智能稱重中落地應用&#xff0c;通過自動、準確地識別牛只并記錄體重數據&#xff0c;顯著提升效率和數據精準度&#xff0c;實現了“效果驅動復購”的良性循環。健永科技RFID技術在北京某養殖企業智能…

計算機網絡:2、TCP和UDP

2、TCP和UDP 簡介 TCP(transmission Control Protocol)&#xff1a;是一種通信標準&#xff0c;它使應用程序和計算設備能夠在網絡上交換消息。它的設計目的是在互聯網上發送數據包&#xff0c;并確保數據和信息在網絡上的成功傳遞。UDP(the User Datagram Protocol)&#xf…

WEB安全篇:瀏覽器攻擊原理及防護

1、XSS&#xff1a;跨站腳本攻擊就是攻擊者想盡一切辦法將可以執行的代碼注入到網頁中。攻擊者在web頁面惡意插入HTML或script標簽&#xff0c;當用戶瀏覽該頁面時&#xff0c;惡意代碼就會被執行&#xff0c;從而達到攻擊的目的。XSS利用的是用戶對指定網站的信任。比如&#…

匯編語言學習2---GNU Debugger (GDB)

學習記錄&#xff0c;在匯編語言 &#xff0c;我們面對的是機器碼&#xff08;以匯編指令形式展現&#xff09;&#xff0c;所以斷點要設置在機器碼被加載到內存中的位置。 GEF插件使用 安裝插件wget -O ~/.gdbinit-gef.py -q https://gef.blah.cat/pyecho source ~/.gdbinit-g…

談談架構的內容

一、架構的定義架構是一個界定不清的東西&#xff0c;我們很難講清楚哪些東西是架構&#xff0c;哪些東西不是架構。但軟件行業里其實人人都在搞架構&#xff0c;軟件設計就是架構本身。架構這個詞出現得很早&#xff0c;有些人認為是 NASA&#xff08;也可能是NATO&#xff09…

C#文件(夾)讀取相關(完善中。。。)

前言閱讀項目編輯器的代碼時&#xff0c;發現好多與文件&#xff08;夾&#xff09;路徑相關代碼。本來自己之前對路徑相關的東西就模模糊糊&#xff0c;希望通過這篇筆記能讓自己模糊的地方明朗一下。" / " 與 " \ "你是否有過這樣的疑惑&#xff1a;Wind…

FPGA DP1.4 With DSC解決方案

引言&#xff1a;迎接高清高刷時代的顯示挑戰隨著8K分辨率、高刷新率、HDR和更廣色域內容的普及&#xff0c;傳統視頻接口的帶寬正面臨極限。DisplayPort 1.4標準雖提供了高達32.4 Gbps的帶寬&#xff08;HBR3速率&#xff09;&#xff0c;但要無壓縮地傳輸8K60Hz 10bpp HDR視頻…

新手向:Python開發簡易網絡服務器

Python網絡服務器開發指南&#xff1a;從零開始的完整實現網絡服務器基礎概念網絡服務器是互聯網基礎設施的核心組件&#xff0c;它本質上是一個持續運行的程序&#xff0c;負責監聽特定端口&#xff08;如HTTP服務的80端口或HTTPS的443端口&#xff09;&#xff0c;處理來自客…

819 機器學習-決策樹2

一、決策樹的算法信息增益&#xff1a;某個屬性帶來的熵增1、決策樹三大經典算法? ID3 → 信息增益 信息增益&#xff1a;某個屬性帶來的熵增? C4.5 → 信息增益率 信息增益率&#xff1a;信息增益自身熵? CART → 基尼指數&#xff08;分類&#xff09;&#xff1b;平方誤…

Objective-C 版本的 LiveEventBus 效果

想要 Objective-C 版本的 LiveEventBus 效果&#xff08;跨頁面/跨模塊通信&#xff0c;支持粘性和非粘性事件&#xff09;。在 iOS 里對應的就是 NSNotificationCenter&#xff0c;但是它 默認不支持粘性事件&#xff0c;所以如果你想要“粘性”&#xff0c;需要自己封裝一層。…