及时做APP开发实战(十一)-性能优化实践 📅 2026/7/19 2:54:32 及时做APP开发实战(十一)-性能优化实践本文将详细介绍HarmonyOS应用性能优化的关键实践包括定时器销毁和不可变数组操作。一、性能优化概述1.1 为什么需要性能优化┌─────────────────────────────────────┐ │ 性能问题影响 │ ├─────────────────────────────────────┤ │ 内存泄漏 → 应用卡顿、崩溃 │ │ UI不刷新 → 数据不同步、体验差 │ │ 长列表卡顿 → 滑动不流畅 │ │ 后台耗电 → 用户投诉、卸载 │ └─────────────────────────────────────┘1.2 优化目标优化项目标效果定时器销毁杜绝内存泄漏后台无无效计时不可变数组UI正确刷新数据实时同步懒加载减少渲染开销长列表流畅二、定时器销毁优化2.1 问题分析【图1定时器泄漏场景】┌─────────────────────────────────────┐ │ 定时器生命周期 │ ├─────────────────────────────────────┤ │ [页面进入] │ │ ↓ │ │ [启动定时器] setInterval() │ │ ↓ │ │ [用户退出页面] │ │ ↓ │ │ ❌ 定时器未销毁 → 后台持续运行 │ │ ↓ │ │ ❌ 内存泄漏 耗电 │ └─────────────────────────────────────┘2.2 正确实现方式EntryComponentstruct PomodoroPage{// 定时器IDprivatetimerId:number-1;// 启动计时器startTimer(){if(this.timerId-1){this.timerIdsetInterval((){// 计时逻辑},1000);}}// 停止计时器stopTimer(){if(this.timerId!-1){clearInterval(this.timerId);this.timerId-1;// 重置ID}}// 页面销毁时清理aboutToDisappear(){this.stopTimer();// ✅ 确保定时器被销毁}}2.3 关键要点┌─────────────────────────────────────┐ │ 定时器销毁规范 │ ├─────────────────────────────────────┤ │ 1. 使用timerId追踪定时器 │ │ 2. 销毁后重置timerId为-1 │ │ 3. 在aboutToDisappear中调用销毁 │ │ 4. 避免重复启动定时器 │ └─────────────────────────────────────┘三、不可变数组操作3.1 问题分析【图2可变vs不可变操作】可变操作❌ 不推荐 ┌─────────────────────────────────────┐ │ this.todoList.push(todo) │ │ this.todoList[index] todo │ │ item.completed !item.completed │ └─────────────────────────────────────┘ ↓ 直接修改原数组/对象 ↓ ❌ UI可能不刷新 不可变操作✅ 推荐 ┌─────────────────────────────────────┐ │ this.todoList [...this.todoList, todo] │ │ this.todoList this.todoList.map(...) │ │ this.todoList this.todoList.filter(...) │ └─────────────────────────────────────┘ ↓ 创建新数组/对象 ↓ ✅ 触发UI刷新3.2 优化前后对比添加待办// ❌ 优化前直接pushasyncaddTodo(text:string):PromiseTodoItem{consttodocreateTodoItem(text);this.todoList.push(todo);// 直接修改原数组returntodo;}// ✅ 优化后创建新数组asyncaddTodo(text:string):PromiseTodoItem{consttodocreateTodoItem(text);this.todoList[...this.todoList,todo];// 创建新数组returntodo;}更新待办// ❌ 优化前直接修改索引asyncupdateTodo(todo:TodoItem):Promisevoid{constindexthis.todoList.findIndex(itemitem.idtodo.id);if(index!-1){this.todoList[index]todo;// 直接修改}}// ✅ 优化后使用map创建新数组asyncupdateTodo(todo:TodoItem):Promisevoid{this.todoListthis.todoList.map(itemitem.idtodo.id?todo:item);}切换完成状态// ❌ 优化前直接修改对象属性asynctoggleTodoComplete(todoId:number):Promisevoid{consttodothis.todoList.find(itemitem.idtodoId);if(todo){todo.completed!todo.completed;// 直接修改}}// ✅ 优化后创建新对象asynctoggleTodoComplete(todoId:number):Promisevoid{this.todoListthis.todoList.map(item{if(item.idtodoId){// 创建新对象constnewItem:TodoItem{id:item.id,text:item.text,completed:!item.completed,pomodoroCount:item.pomodoroCount,createdAt:item.createdAt};returnnewItem;}returnitem;});}3.3 不可变操作方法总结操作可变方法不可变方法添加arr.push(item)arr [...arr, item]删除arr.splice(i, 1)arr arr.filter(...)更新arr[i] itemarr arr.map(...)修改属性obj.prop val创建新对象四、性能监控工具4.1 PerformanceUtil实现importhilogfromohos.hilog;exportclassPerformanceUtil{privatestaticinstance:PerformanceUtil|nullnull;privatetimers:Mapstring,numbernewMap();// 获取单例publicstaticgetInstance():PerformanceUtil{if(!PerformanceUtil.instance){PerformanceUtil.instancenewPerformanceUtil();}returnPerformanceUtil.instance;}// 开始计时publicstartTimer(key:string):void{this.timers.set(key,Date.now());}// 结束计时publicendTimer(key:string):number{conststartTimethis.timers.get(key);if(startTime){constdurationDate.now()-startTime;this.timers.delete(key);hilog.info(0x0000,Performance,[${key}] 耗时:${duration}ms);returnduration;}return0;}}4.2 在业务代码中使用import{PerformanceUtil}from../utils/PerformanceUtil;exportclassTodoViewModel{privateperformanceUtil:PerformanceUtilPerformanceUtil.getInstance();asyncaddTodo(text:string):PromiseTodoItem{this.performanceUtil.startTimer(addTodo);// 业务逻辑...this.todoList[...this.todoList,todo];this.performanceUtil.endTimer(addTodo);returntodo;}}五、最佳实践总结5.1 定时器管理规范【图3定时器管理清单】┌─────────────────────────────────────┐ │ ✅ 定时器管理规范 │ ├─────────────────────────────────────┤ │ □ 使用成员变量追踪timerId │ │ □ 销毁后重置timerId │ │ □ 在aboutToDisappear中清理 │ │ □ 避免重复启动 │ │ □ 使用性能监控记录耗时 │ └─────────────────────────────────────┘5.2 数组操作规范【图4数组操作规范】┌─────────────────────────────────────┐ │ ✅ 数组操作规范 │ ├─────────────────────────────────────┤ │ □ 添加使用展开运算符 [...arr, item] │ │ □ 删除使用filter创建新数组 │ │ □ 更新使用map创建新数组 │ │ □ 修改属性创建新对象 │ │ □ 避免直接修改原数组/对象 │ └─────────────────────────────────────┘六、总结本文介绍了HarmonyOS应用性能优化的两个关键实践定时器销毁确保页面退出时清理定时器避免内存泄漏不可变数组操作使用创建新数组的方式触发UI刷新这些优化可以显著提升应用的稳定性和用户体验。