news 2026/6/9 16:01:13

HarmonyOS 教学实战(二):加入网络请求与缓存(让你的应用真正“像个正式 App”)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
HarmonyOS 教学实战(二):加入网络请求与缓存(让你的应用真正“像个正式 App”)

在上一篇文章中,我们已经完成了一个:

✔ 能运行
✔ 有完整页面
✔ 有组件拆分
✔ 有状态管理(V2)
✔ 有真实业务逻辑

任务清单 App

但说实话——
它还不像一个“真正的应用”。

因为它缺了两样东西:

网络请求+数据缓存

这一篇,我们就把应用往“真实产品”方向再推进一步。


一、这一篇我们要做什么?

继续在「任务清单 App」基础上,新增 4 个能力:

  1. 🔗 从服务器获取任务列表

  2. ⏳ 页面加载状态(Loading)

  3. 💾 本地缓存(Preferences)

  4. 🛜 网络失败自动兜底(缓存 + 提示)

完成后,你的应用将具备:

“有网用网,没网用缓存”的真实体验


二、整体设计思路(非常关键)

在写代码之前,先明确职责分工

层级负责什么
UI 组件展示数据、响应点击
Store(Model)数据管理、业务逻辑
Network Service网络请求
Cache Service本地缓存
Page组合 & 调度

📌UI 永远不直接发请求
📌UI 永远不直接操作缓存


三、准备一个“假的后端接口”

为了教学,我们假设服务端返回的数据格式如下:

[ { "id": 1, "title": "学习 HarmonyOS" }, { "id": 2, "title": "写教学文章" } ]

接口地址(示例):

https://example.com/api/tasks

四、第一步:封装网络请求层(推荐写法)

新增目录结构

entry/ └─ service/ └─ TaskService.ets

service/TaskService.ets

import http from '@ohos.net.http' import { Task } from '../model/TaskModel' export class TaskService { static async fetchTasks(): Promise<Task[]> { const httpRequest = http.createHttp() const response = await httpRequest.request( 'https://example.com/api/tasks', { method: http.RequestMethod.GET, expectDataType: http.HttpDataType.STRING } ) const data = JSON.parse(response.result as string) return data.map(item => new Task(item.id, item.title)) } }

教学重点

  • 网络请求单独封装

  • UI 完全不知道请求细节

  • 返回的是业务对象 Task


五、第二步:加入本地缓存(Preferences)

新增缓存工具类

entry/ └─ service/ └─ CacheService.ets

service/CacheService.ets

import preferences from '@ohos.data.preferences' import { Task } from '../model/TaskModel' const CACHE_KEY = 'TASK_LIST' export class CacheService { static async saveTasks(tasks: Task[]) { const pref = await preferences.getPreferences(getContext(), 'task_cache') await pref.put(CACHE_KEY, JSON.stringify(tasks)) await pref.flush() } static async loadTasks(): Promise<Task[] | null> { const pref = await preferences.getPreferences(getContext(), 'task_cache') const data = await pref.get(CACHE_KEY, '') if (!data) return null const list = JSON.parse(data) return list.map(item => new Task(item.id, item.title)) } }

📌 Preferences 非常适合:

  • 少量数据

  • 配置

  • 列表缓存


六、第三步:升级 TaskStore(核心改造)

现在轮到真正的“大脑”—— Store。

修改model/TaskModel.ets

import { TaskService } from '../service/TaskService' import { CacheService } from '../service/CacheService' @ObservedV2 export class TaskStore { tasks: Task[] = [] loading: boolean = false error: string = '' async loadTasks() { this.loading = true this.error = '' try { const remoteTasks = await TaskService.fetchTasks() this.tasks = remoteTasks CacheService.saveTasks(remoteTasks) } catch (e) { const cache = await CacheService.loadTasks() if (cache) { this.tasks = cache } else { this.error = '加载失败,请检查网络' } } finally { this.loading = false } } addTask(title: string) { this.tasks.unshift(new Task(Date.now(), title)) CacheService.saveTasks(this.tasks) } removeTask(id: number) { this.tasks = this.tasks.filter(item => item.id !== id) CacheService.saveTasks(this.tasks) } get count(): number { return this.tasks.length } }

教学重点(非常重要)

  • Store同时协调

    • 网络

    • 缓存

    • UI 状态

  • UI 只关心三个字段:

    • tasks

    • loading

    • error


七、第四步:页面中触发加载(@Once)

修改pages/Index.ets

@ComponentV2 struct Index { @Local store = new TaskStore() @Once async init() { await this.store.loadTasks() } build() { Column({ space: 12 }) { Text("📋 我的任务清单") .fontSize(22) if (this.store.loading) { Text("加载中...") } else if (this.store.error) { Text(this.store.error).fontColor(Color.Red) } else { Text(`任务数:${this.store.count}`) TaskInput({ onAdd: (title) => this.store.addTask(title) }) TaskList({ tasks: this.store.tasks, onDelete: (id) => this.store.removeTask(id) }) } } .padding(16) } }

📌@Once
👉 页面创建时只执行一次
👉 非常适合初始化请求


八、现在这个应用已经进化到什么程度?

你现在的 App 具备了:

✔ 网络请求
✔ Loading 状态
✔ 错误处理
✔ 本地缓存
✔ 离线可用
✔ 状态集中管理
✔ UI 与业务解耦

这已经是正式商用 App 的基础形态


九、如果这是你自己的项目,下一步可以做什么?

🚀 可扩展方向

  1. 下拉刷新(重新调用 loadTasks)

  2. 网络状态监听(自动切换)

  3. 分页加载

  4. 登录态 + Token 缓存

  5. 请求拦截 & 统一错误码

  6. 数据同步策略(本地 → 云)


十、你应该真正学会的不是 API

而是这套思路:

UI 不关心数据从哪里来
Store 决定用网络还是缓存
Service 只做一件事

这是HarmonyOS、Vue、React、Flutter 通用的工程思维


结语

到这一篇为止,你已经不是“写 Demo”的水平了,而是:

已经在用 HarmonyOS 的正确方式写“真实应用”

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/8 12:29:02

14、信号处理中的核特征提取与降维

信号处理中的核特征提取与降维 在当今的信号处理领域,基于核的特征提取和降维技术正变得越来越重要,尤其是在处理高维数据的应用场景中。本文将深入探讨这一领域的相关方法,包括多元分析、基于核依赖估计的特征提取、大规模和半监督问题的扩展,以及域适应等方面。 1. 多元…

作者头像 李华
网站建设 2026/6/8 12:11:23

Java List 完全指南:从接口特性到四大实现类深度解析

Java List 完全指南&#xff1a;从接口特性到四大实现类深度解析 一、介绍 List 是 Java 集合框架&#xff08;java.util&#xff09;中有序、可重复的集合接口&#xff0c;继承自 Collection 接口&#xff0c;是日常开发中最常用的集合类型之一。其核心特征是&#xff1a;元素…

作者头像 李华
网站建设 2026/6/5 2:11:34

基于unsloth的Qwen3 模型高效微调流程

一、核心工具 模型微调全流程需安装以下工具&#xff1a; 必装工具&#xff1a;Unsloth&#xff08;高效微调框架&#xff09;可选工具&#xff1a; vLLM&#xff08;模型调度与推理验证&#xff09;EvalScope&#xff08;模型性能评估&#xff09;wandb&#xff08;训练过程监…

作者头像 李华
网站建设 2026/6/10 3:36:54

众包测试的组织与管理:数字化时代的质量保障新范式

随着数字化转型加速&#xff0c;软件测试面临前所未有的复杂性和时效性挑战。众包测试作为一种新兴的质量保障模式&#xff0c;通过整合分布式测试者的集体智慧&#xff0c;有效弥补传统测试在场景覆盖、用户体验及成本控制方面的不足。据Gartner研究预测&#xff0c;到2026年&…

作者头像 李华
网站建设 2026/6/9 8:23:19

RustFS分布式存储扩容实战指南:3步搞定性能线性增长

RustFS分布式存储扩容实战指南&#xff1a;3步搞定性能线性增长 【免费下载链接】rustfs &#x1f680; High-performance distributed object storage that is faster than MinIO 项目地址: https://gitcode.com/GitHub_Trending/rus/rustfs &#x1f4a1; 我们一起来解…

作者头像 李华
网站建设 2026/6/10 12:31:31

计算机毕业设计Django+LLM大模型智能路线规划数据分析与个性化推荐系统 旅游路线推荐系统 旅游路线规划系统 大数据毕业设计

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长联系方式的名片&#xff01; 技术范围&#xff1a;Sprin…

作者头像 李华