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

陈杨
• 阅读 1

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


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

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

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<any> {  
    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线程),但耗时操作(网络请求/数据库读写)需放在子线程。官方推荐用 TaskDispatcherEmitter 通信。

实战场景:子线程获取数据 → 主线程刷新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 不能导入 entryfeatures 的代码。

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

      "dependencies": {  
        "features/news": ">=1.0.0",  
        "common": ">=1.0.0"  
      }  
  2. ​多设备适配杀手锏​​:
    资源限定词 区分设备,如:

    • news_page.phone.ets → 手机版新闻页
    • news_page.tablet.ets → 平板版(大屏布局)
      编译时自动匹配设备类型打包!

结尾

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

  1. 公共代码坚决下沉到 common 层;
  2. 子线程操作后,​​必须用Emitter回主线程更新UI​​;
  3. 新功能尽量拆成HAP,方便热更新。

遇到坑?欢迎留言讨论。

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

点赞
收藏
评论区
推荐文章
陈杨 陈杨
4星期前
鸿蒙5开发隐藏案例分享---自由流转的浏览进度接续
✨鸿蒙开发隐藏案例大揭秘!手把手教你玩转应用接续功能✨大家好呀~今天要跟大家分享一个超实用的鸿蒙开发技巧!之前总觉得鸿蒙的官方文档案例藏得太深,最近偶然挖到了「应用接续」相关的宝藏代码,忍不住连夜整理成干货!这篇内容会用最白话的方式超多案例,带大家轻松实
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---三折叠应用开发分享
鸿蒙三折叠应用开发宝藏分享:官方案例详解与实战代码大家好呀!今天在翻鸿蒙文档时发现一个​​超级宝藏​​——官方提供的三折叠开发案例!之前总觉得多设备适配复杂,没想到HarmonyOS早就准备好了完善方案。话不多说,直接上干货,结合代码带大家玩转三折叠屏开发
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---PC开发案例解析
鸿蒙PC/2in1开发宝藏指南:官方案例实战解析​​大家好呀!​​最近在折腾鸿蒙的PC/2in1应用开发,才发现官方文档里藏了一堆超实用的案例!这些案例就像“隐藏关卡”,能帮你少踩80%的坑。今天我就把这些宝藏整理出来,结合代码带大家手把手实战,保你看完直
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---模块化设计案例分享
以下是一篇结合HarmonyOS模块化设计理念与实际开发案例的详细分享,包含代码讲解和实用技巧:🌟鸿蒙模块化开发大揭秘!官方隐藏案例实战指南​​大家好呀!​​最近在HarmonyOS文档里挖到一个宝藏——官方其实藏了大量模块化设计案例!很多小伙伴可能没注
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---分析帧率问题
鸿蒙性能优化宝藏:帧率问题实战案例解析​​嘿,各位鸿蒙开发者!​​今天分享一个开发中的大发现——鸿蒙官方文档里藏着一堆超实用的性能优化案例!这些案例不仅解决了常见的丢帧卡顿问题,还附带了详细的分析思路和代码改造方案。我整理了几个高频场景,结合代码讲解,帮你
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---Web页面内点击响应时延分析
当然可以!下面是一篇详细、易懂的文章,结合鸿蒙官方案例和实际代码,帮你深入理解Web加载完成时延的优化技巧👇🚀鸿蒙开发宝藏:Web加载完成时延优化实战(附代码解析)大家好呀!今天在翻鸿蒙开发者文档时,发现了一个隐藏的​​性能优化宝藏区​​——官方竟然悄
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---Web加载时延优化解析
当然可以!下面是一篇详细、易懂的文章,结合鸿蒙官方案例和实际代码,帮你深入理解Web加载完成时延的优化技巧👇🚀鸿蒙开发宝藏:Web加载完成时延优化实战(附代码解析)大家好呀!今天在翻鸿蒙开发者文档时,发现了一个隐藏的​​性能优化宝藏区​​——官方竟然悄
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---内存优化实战指南
好的,没问题!发现官方宝藏确实让人兴奋,这就帮你整理一篇更详细、更接地气的鸿蒙内存优化实战指南,结合官方文档的精华,加点“私货”和代码示例,咱们好好聊聊!​​标题:鸿蒙开发隐藏宝藏!内存优化实战指南,让你的应用丝滑又省电​​​​Hey,各位鸿蒙开发者们!​
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---瀑布流优化实战分享
以下是根据鸿蒙官方瀑布流优化案例整理的非官方技术分享,结合开发实战经验重新解读,加入更多场景分析和代码示例:🌟鸿蒙瀑布流性能优化实战:告别卡顿的宝藏指南!大家好!最近在鸿蒙文档里挖到一个性能优化宝藏库,原来官方早就准备好了各种场景的最佳实践!今天重点分享
陈杨 陈杨
10小时前
鸿蒙5开发宝藏案例分享---优化应用包体积大小问题
🎉鸿蒙包体积优化实战:藏在官方文档里的宝藏技巧!大家好呀~我是你们的鸿蒙开发小伙伴!今天在翻官方文档时,发现了一个超实用的「包体积优化」案例宝藏库!这些技巧明明能大幅提升应用体验,却很少被讨论。赶紧来跟大家分享一波,附代码详解和实操建议,让你的应用秒瘦身