鸿蒙5开发宝藏案例分享---应用架构实战技巧

简介: 本文深入探讨鸿蒙应用架构设计与线程通信实战技巧,涵盖分层架构(产品定制层、基础特性层、公共能力层)的实际应用,通过代码示例讲解如何降低耦合、实现多端复用。同时解析子线程安全更新UI的实现方式,利用 `TaskDispatcher` 和 `Emitter` 进行线程间通信。此外,还分享模块化设计中 HAP、HAR、HSP 的选择与动态加载技巧,以及官方文档未明确提及的开发经验。帮助开发者将理论转化为实践,提升应用性能与可维护性。

**大家好!** 今天咱们聊聊鸿蒙开发中那些“官方文档提了但实际开发难找”的架构设计技巧。结合官方文档,我会用**真实代码案例+通俗讲解**,帮你把分层架构和线程通信落地到项目里,告别“理论会了,代码不会”的尴尬!

* * *

### 一、分层架构:三层设计到底怎么用?

鸿蒙的分层架构(产品定制层、基础特性层、公共能力层)不是空谈,核心是**降低耦合**和**多端复用**。直接看代码结构:

```

MyApp/  

│  

├── entry/          # 产品定制层:设备专属入口  

│   ├── phone/      # 手机端UI和逻辑  

│   └── tablet/     # 平板端定制  

│  

├── features/       # 基础特性层:可插拔业务模块  

│   ├── news/       # 新闻模块(独立HAP)  

│   └── settings/   # 设置模块  

│  

└── common/         # 公共能力层  

   ├── components/ # 公共UI组件  

   ├── utils/      # 工具库  

   └── network/    # 网络请求封装  

```

#### 关键代码示例:

**1. 公共能力层抽离网络请求**

```

// common/network/Request.ts  

export class Request {  

 static async fetch(url: string): Promise {  

   try {  

     const response = await http.createHttp().request(url);  

     return response.data;  

   } catch (err) {  

     // 统一错误处理  

     console.error("Network error:", err);  

   }  

 }  

}  

```

**2. 基础特性层调用公共能力**

```

// features/news/NewsViewModel.ts  

import { Request } from '../../common/network/Request';  

class NewsViewModel {  

 async loadNews() {  

   const data = await Request.fetch('https://api.news.com/list');  

   // 业务逻辑处理...  

 }  

}  

```

**3. 产品定制层按设备加载模块**

```

// entry/phone/resources/base/profile/main_pages.json  

{  

 "src": [  

   "pages/PhoneHome",       // 手机首页  

   "pages/NewsPage?module=news" // 动态加载新闻模块  

 ]  

}  

```

> **为什么这样设计?**

>

> -   改网络请求?只需动 `common/network`,不影响业务代码。

> -   加新设备(如手表)?复制 `entry/phone` 改为 `entry/watch` 定制UI。

> -   下架新闻模块?直接移除 `features/news` 的HAP包。

* * *

### 二、线程通信:子线程如何安全更新UI?

鸿蒙的UI更新必须在主线程(也叫UI线程),但耗时操作(网络请求/数据库读写)需放在子线程。官方推荐用 `TaskDispatcher` 和 `Emitter` 通信。

#### 实战场景:子线程获取数据 → 主线程刷新UI

```

// 在ViewModel中  

import { emitter, TaskDispatcher } from '@ohos.base';  

import { Request } from '../common/network/Request';  

const UI_TASK_DISPATCHER = TaskDispatcher.getGlobalTaskDispatcher(TaskDispatcher.Priority.HIGH);  

class UserViewModel {  

 private userId: string = '';  

 // 1. 子线程获取数据  

 async fetchUserData() {  

   const backgroundTask: TaskDispatcher = TaskDispatcher.createBackgroundTaskDispatcher();  

   backgroundTask.asyncDispatch(() => {  

     const data = Request.fetch(`https://api.user.com/${this.userId}`);  

     // 2. 通过Emitter发送数据到主线程  

     emitter.emit('USER_DATA_LOADED', data);  

   });  

 }  

 // 3. 主线程监听事件  

 setupEventListener() {  

   emitter.on('USER_DATA_LOADED', (data) => {  

     UI_TASK_DISPATCHER.asyncDispatch(() => {  

       // 安全更新UI  

       this.userInfo = data;  

       AppStorage.setOrCreate('userName', data.name); // 绑定到UI组件  

     });  

   });  

 }  

}  

```

> **避坑指南:**

>

> -   错误示例:在子线程直接调 `AppStorage.set()` → 导致UI崩溃。

> -   正确姿势:子线程发事件 → 主线程用 `asyncDispatch` 更新数据。

> -   性能优化:高频更新?用 `@State` + `@Watch` 局部刷新组件。

* * *

### 三、模块化设计:HAP、HAR、HSP怎么选?

官方文档总提这些概念,实际开发这样用:

| 类型          | 场景          | 代码示例                                         |

| ----------- | ----------- | -------------------------------------------- |

| **HAP** | 独立功能模块(如设置) | `build-profile.json` 中配置 `"type": "feature"` |

| **HAR** | 公共工具库(无UI)  | 被多个HAP依赖的静态库                                 |

| **HSP** | 跨应用共享代码     | 声明 `shared: true`                            |

**动态加载HAP模块(常见于插件化)**

```

// 在entry中动态加载新闻模块  

import featureAbility from '@ohos.ability.featureAbility';  

const moduleName = 'news';  

featureAbility.dynamicImport(  

 `bundlename:${moduleName}`,    

 (err, data) => {  

   if (err) return;  

   // 加载成功后跳转到新闻页  

   router.pushUrl({ url: 'pages/NewsPage' });  

 }  

);  

```

* * *

### 四、官方文档没明说的实战技巧

1.  **公共能力层防“污染”**:

   -   禁止上层反向依赖:`common` 不能导入 `entry` 或 `features` 的代码。

   -   检查方法:在 `build-profile.json` 配置依赖关系:

       ```

       "dependencies": {  

         "features/news": ">=1.0.0",  

         "common": ">=1.0.0"  

       }  

       ```

1.  **多设备适配杀手锏**:  

   用 `资源限定词` 区分设备,如:

   -   `news_page.phone.ets` → 手机版新闻页

   -   `news_page.tablet.ets` → 平板版(大屏布局)  

       编译时自动匹配设备类型打包!

* * *

### 结尾

鸿蒙的分层和模块化设计,初期搭建费点劲,但后期维护真香!建议大家:

1.  公共代码坚决下沉到 `common` 层;

1.  子线程操作后,**必须用Emitter回主线程更新UI**;

1.  新功能尽量拆成HAP,方便热更新。

遇到坑?欢迎留言讨论。

**保持封装,拒绝耦合,咱们下期见!** 🚀

相关文章
|
4月前
|
监控 JavaScript 编译器
从“天书”到源码:HarmonyOS NEXT 崩溃堆栈解析实战指南
本文详解如何利用 hiAppEvent 监控并获取 sourcemap、debug so 等核心产物,剖析了 hstack 工具如何将混淆的 Native 与 ArkTS 堆栈还原为源码,助力开发者掌握异常分析方法,提升应用稳定性。
586 64
|
4月前
|
前端开发 JavaScript BI
如何开发车辆管理系统中的车务管理板块(附架构图+流程图+代码参考)
本文介绍了中小企业如何通过车务管理模块提升车辆管理效率。许多企业在管理车辆时仍依赖人工流程,导致违章处理延误、年检过期、维修费用虚高等问题频发。将这些流程数字化,可显著降低合规风险、提升维修追溯性、优化调度与资产利用率。文章详细介绍了车务管理模块的功能清单、数据模型、系统架构、API与前端设计、开发技巧与落地建议,以及实现效果与验收标准。同时提供了数据库建表SQL、后端Node.js/TypeScript代码示例与前端React表单设计参考,帮助企业快速搭建并上线系统,实现合规与成本控制的双重优化。
|
4月前
|
移动开发 前端开发 Android开发
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
601 12
【02】建立各项目录和页面标准化产品-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 JavaScript 应用服务中间件
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
523 5
【06】优化完善落地页样式内容-精度优化-vue加vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
移动开发 Rust JavaScript
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
900 4
【01】首页建立-vue+vite开发实战-做一个非常漂亮的APP下载落地页-支持PC和H5自适应提供安卓苹果鸿蒙下载和网页端访问-优雅草卓伊凡
|
4月前
|
运维 监控 安全
公链开发中的高可用架构设计要点
本指南提供公链高可用架构的可复用流程与模板,涵盖目标拆解、先决条件、分步执行、故障排查及验收标准,结合跨链DApp与量化机器人案例,提升落地效率与系统稳定性。
|
4月前
|
消息中间件 运维 监控
交易所开发核心架构拆解与流程图
本文系统解析交易所架构核心要素,从接入层到清算结算,结合系统流程图拆解各模块职责与协作机制。深入剖析撮合引擎、账本设计与风控逻辑,建立性能、可用性、安全性等多维评估标准,并提供可落地的流程图绘制、压测优化与进阶学习路径,助力构建高效、安全、可扩展的交易系统。(238字)
|
4月前
|
Cloud Native Serverless API
微服务架构实战指南:从单体应用到云原生的蜕变之路
🌟蒋星熠Jaxonic,代码为舟的星际旅人。深耕微服务架构,擅以DDD拆分服务、构建高可用通信与治理体系。分享从单体到云原生的实战经验,探索技术演进的无限可能。
微服务架构实战指南:从单体应用到云原生的蜕变之路
|
4月前
|
监控 Cloud Native Java
Spring Boot 3.x 微服务架构实战指南
🌟蒋星熠Jaxonic,技术宇宙中的星际旅人。深耕Spring Boot 3.x与微服务架构,探索云原生、性能优化与高可用系统设计。以代码为笔,在二进制星河中谱写极客诗篇。关注我,共赴技术星辰大海!(238字)
Spring Boot 3.x 微服务架构实战指南

热门文章

最新文章