一、精准资源管理

(一)资源延迟加载

在onCreate阶段,并非所有资源都需立即加载。对于一些非关键、占用资源较大的内容,如高清图片库、复杂的音频文件等,可延迟到实际需要时加载。例如,一个新闻类应用,文章详情页的高清配图可在用户点击进入详情页(onPageShow)时再进行加载,而非在应用启动的onCreate阶段加载,这样能加快应用启动速度,减少初始内存占用。

@Entry
@Component
struct NewsArticlePage {
@State articleImage: string = '';
onPageShow() {
this.articleImage = loadImageFromServer('article - id - 123');
}
build() {
// 页面构建,根据articleImage展示图片
}
}

(二)及时释放资源

在onBackground和onDestroy阶段,务必及时释放不再使用的资源。以使用摄像头资源为例,在onBackground中就应关闭摄像头,防止资源浪费和潜在的冲突。

@Override
public void onBackground(Intent intent) {
super.onBackground(intent);
Camera camera = Camera.getInstance();
if (camera.isOpen()) {
camera.release();
}
}

对于一些持有系统资源的对象,如数据库连接、网络连接等,在onDestroy中确保关闭连接,避免资源泄漏,提升应用稳定性。

@Override
protected void onDestroy() {
super.onDestroy();
DatabaseHelper.getInstance().close();
NetworkClient.getInstance().disconnect();
}

二、高效状态保存与恢复

(一)合理选择存储方式

在应用切换到后台或进程被系统回收时,需要保存应用状态。对于简单的状态数据,如用户当前所在页面索引、开关状态等,可使用Preferences进行本地存储。

Preferences preferences = Preferences.createWithMode(this, "app_state", Preferences.PRIVATE);
preferences.putInt("current_page", currentPageIndex);
preferences.putBoolean("is_notification_enabled", isNotificationEnabled);
preferences.flush();

而对于复杂的数据结构,如用户编辑的文档内容、购物车商品列表等,可考虑使用 JSON 格式存储到本地文件或通过分布式数据服务进行跨设备存储,方便在应用重新启动或跨设备恢复时使用。

(二)快速恢复状态

在应用重新进入前台或重新启动时,要快速恢复保存的状态。在onCreate或onForeground中读取保存的状态数据,并应用到相应的 UI 和业务逻辑中。例如,一个笔记应用,在onCreate中读取用户上次编辑的笔记内容并显示在界面上。

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Preferences preferences = Preferences.createWithMode(this, "app_state", Preferences.PRIVATE);
String lastEditedNote = preferences.getString("last_edited_note", "");
// 设置UI显示lastEditedNote
}

三、优化页面加载

(一)预加载技术

在页面即将显示前,利用onPageShow或相关的预加载时机,提前加载页面所需的数据和资源。例如,一个电商商品列表页面,在onPageShow中提前发起网络请求获取商品数据,当页面真正展示时,数据已准备好,能快速渲染。

@Entry
@Component
struct ProductListPage {
@State productList: Product[] = [];
onPageShow() {
this.productList = fetchProductsFromServer();
}
build() {
// 构建商品列表UI,展示productList
}
}

(二)优化组件加载顺序

对于包含多个组件的复杂页面,合理安排组件的加载顺序。先加载关键、可见区域的组件,后加载非关键、隐藏区域或需要复杂计算的组件。例如,一个图文混排的页面,先加载文本内容,让用户能快速看到文字信息,再逐步加载图片组件,避免因图片加载慢导致页面长时间空白。在组件的aboutToAppear中控制加载逻辑,确保重要组件优先加载。

@Component
struct TextAndImageComponent {
@State isImageLoaded: boolean = false;
aboutToAppear() {
if (isCriticalComponent()) {
// 关键组件,立即加载
loadTextContent();
} else {
// 非关键组件,延迟加载
setTimeout(() => {
loadImageContent();
this.isImageLoaded = true;
}, 500);
}
}
build() {
// 构建UI,根据isImageLoaded显示图片
}
}

四、响应系统事件

(一)处理配置变化

当设备的配置发生变化,如屏幕旋转、语言切换时,onConfigurationChanged回调会被触发。在这个回调中,合理处理 UI 和资源的调整,避免不必要的页面重建和资源重新加载。例如,在屏幕旋转时,如果页面布局只需简单调整,可在onConfigurationChanged中直接修改布局参数,而不是重新加载整个页面。

@Override
public void onConfigurationChanged(Configuration configuration) {
super.onConfigurationChanged(configuration);
if (configuration.orientation == Configuration.ORIENTATION_LANDSCAPE) {
// 横屏时调整布局参数
WindowStage windowStage = getWindowStage();
if (windowStage!= null) {
windowStage.getUIContent().setLayoutDirection(LayoutDirection.LTR);
}
} else {
// 竖屏时调整布局参数
WindowStage windowStage = getWindowStage();
if (windowStage!= null) {
windowStage.getUIContent().setLayoutDirection(LayoutDirection.TRT);
}
}
}

(二)应对低内存情况

系统内存紧张时,可能会杀死后台应用进程。在onTrimMemory回调中,根据系统提示的内存状态,采取相应措施,如释放缓存数据、关闭不必要的服务等,提高应用在低内存环境下的生存能力。

@Override
public void onTrimMemory(int level) {
super.onTrimMemory(level);
if (level == Component.TRIM_MEMORY_UI_HIDDEN) {
// 应用UI不可见,释放大量缓存
CacheManager.getInstance().clearAllCaches();
} else if (level == Component.TRIM_MEMORY_RUNNING_MODERATE) {
// 系统内存中度紧张,释放部分缓存
CacheManager.getInstance().clearLeastRecentlyUsedCaches();
}
}

#HarmonyOS应用开发工具##Ark-TS UI#

Logo

讨论HarmonyOS开发技术,专注于API与组件、DevEco Studio、测试、元服务和应用上架分发等。

更多推荐