您当前的位置:首页 > 电脑百科 > 程序开发 > 移动端 > 鸿蒙

聊一聊OpenHarmony启动页后记

时间:2023-03-08 11:30:53  来源:51CTO  作者:

1、回顾

通过DevEco Studio端云协同开发OpenHarmony/HarmonyOS应用程序(以下简称应用)集成AppGallery Connect(以下简称AGC)平台​​云函数​​​、​​云数据库​​​、​​云存储​​三篇文章笔者从创建端云协同应用程序开始,逐步对云函数、云数据库、云存储简单的数据读取做了简单的介绍。通过使用云数据库、云存储相结合的方式使应用的启动页能够动态化,即可以在不更新应用的情况下更改启动页的参数已达到启动页的动态化。

2、问题及解决方案

问题: 由于启动页参数来源于云数据库、云存储,启动页数据渲染前会受网络影响出现白屏。

解决方案: 为启动页数据单独封装获取方法,在启动页新增状态值,数据未加载完成后显示当前应用的​​icon​​图标,数据加载完成后渲染实际获取到的数据。

注: 若读者有其他的处理方法可与笔者共同探讨一下。

3、优化调用方法

使用async将函数异步化,使用awAIt获取Promise的值。

(1)云数据库获取数据方法异步化

每次使用存储区都要在使用完成后释放,新增关闭存储区方法。

// service/CloudDBService.ts
// @ts-ignore
import * as schema from './app-schema.json';
import { splash } from './splash';
import {
    AGConnectCloudDB,
    CloudDBZoneConfig,
    CloudDBZone,
    CloudDBZoneQuery
} from '@hw-agconnect/database-ohos';

import { AGCRoutePolicy } from '@hw-agconnect/core-ohos';

import { getAGConnect } from './AgcConfig';

export class CloudDBService {

    private static readonly ZONE_NAME = "cloudDBZoneSplash";
    private static cloudDB: AGConnectCloudDB;
    private static cloudDBZone: CloudDBZone;
    private static isInit: boolean;

    public static async init(context: any): Promise<boolean> {
        if (this.isInit) {
            return;
        }
        try {
            // 初始化agc
            getAGConnect(context);
            // 初始化Cloud DB
            await AGConnectCloudDB.initialize(context);
            // 获取对应数据处理位置的CloudDB实例
            this.cloudDB = await AGConnectCloudDB.getInstance(AGCRoutePolicy.CHINA);
            // 创建对象类型
            this.cloudDB.createObjectType(schema);
            // 打开存储区
            await this.openZone(this.ZONE_NAME);
            this.isInit = true;
        } catch (err) {
            console.error(JSON.stringify(err))
        }
        return Promise.resolve(this.isInit);
    }

    // 打开存储区
    private static async openZone(zoneName: string): Promise<CloudDBZone> {
        if (this.cloudDBZone) {
            return;
        }
        try {
            const cloudDBZoneConfig = new CloudDBZoneConfig(zoneName);
            this.cloudDBZone = await this.cloudDB.openCloudDBZone(cloudDBZoneConfig);
        } catch (err) {
            console.error(JSON.stringify(err));
        }
    }

    // 关闭存储区
    public static async closeZone(): Promise<void> {
        try {
            this.cloudDB.closeCloudDBZone(this.cloudDBZone);
            this.cloudDBZone = null;
        } catch (err) {
            console.error(JSON.stringify(err))
        }
    }

    public static async query(): Promise<splash> {
        try {
            const query = CloudDBZoneQuery.where(splash).equalTo("status", 1);
            const result = await this.cloudDBZone.executeQuery(query);
            return result.getSnapshotObjects().length > 0 ? result.getSnapshotObjects()[0] : new splash();
        } catch (err) {
            console.error(JSON.stringify(err));
        }
    }
}

 

(2)云存储获取数据方法异步化

// services/cloudstorage/CloudStorageService.ts
import agconnect from '@hw-agconnect/api-ohos';
import "@hw-agconnect/cloudstorage-ohos";

import { getAGConnect } from '../AgcConfig';

export class CloudStorageService {

    public static async init(context: any, path: string): Promise<string> {
        try {
            getAGConnect(context);
            // 初始化默认实例
            const storage = agconnect.cloudStorage();
            // 创建需要下载文件的引用
            const storageReference = await storage.storageReference();
            var reference = await storageReference.child(path);
            return reference.getDownloadURL();
        } catch (err) {
            console.error(JSON.stringify(err));
        }
    }
}

 

4、为启动页数据获取封装专用方法

可以将一些处理逻辑放在该方法中处理。

// services/SplashService.ts
import { splash } from './splash';
import { CloudDBService } from '../services/CloudDBService';
import { CloudStorageService } from '../services/cloudstorage/CloudStorageService';

export class SplashService {

    public static async querySplash(context: any): Promise<splash> {
        try {
            await CloudDBService.init(context);
            let splash = await CloudDBService.query();
            let url = await CloudStorageService.init(context, splash.backgroundImg);
            splash.backgroundImg = url;
            await CloudDBService.closeZone();
            return splash;
        } catch (err) {
            console.error(JSON.stringify(err));
        }
    }
}

 

5、改写启动页

启动页新增状态码,用于数据未加载完成呈现给用户的显示界面,规避数据未获取导致的白屏现象。

@State isSkip: boolean = false;

 

在aboutToAppear()方法中执行获取启动页数据的方法。

aboutToAppear() {
    this.isSkip = false;
    SplashService.querySplash(getContext(this)).then((ret) => {
      this.isSkip = true;
      this.result = ret;
    })
  }
 

页面中使用if(){}else{}条件语句判断渲染的组件,从而规避数据请求时间导致的白屏。

if (this.isSkip) {
  SplashPage({ mSplash: {
    timer: this.result.timer,
    isLogo: this.result.isLogo,
    backgroundImg: this.result.backgroundImg,
    companyName: this.result.companyName,
    mFontColor: this.result.mFontColor
  }, skip: this.onSkip })
} else {
  Column() {
    Image($r('app.media.icon')).objectFit(ImageFit.None)
  }
  .width('100%').height('100%')
}

 

通过更改AGC平台云数据库中启动页数据状态,可以实现下次启动应用程序,启动页呈现不同内容。使用场景如新闻类App可以在启动页呈现一条配备图片的热文;常规App可以在启动页呈现一条经典语录;实现不同节日在启动页呈现问候信息。

6、后记

本文所记为之前文章的总结,针对获取AGC平台各项服务的数据,可直接调用对应的方法即可。若出现复杂的情况,如后面笔者将实现认证服务登录,并将用户信息存储到云数据库中,可以结合云函数,在用户登录的时候,直接调用云函数去保存用户信息,存储方法可以通过云函数的AUTH触发器实现数据存储云数据库中;再如用户上传图片,生成缩略图,也可以利用云函数将原图和缩略图一同保存到云存储中。



Tags:OpenHarmony   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,不构成投资建议。投资者据此操作,风险自担。如有任何标注错误或版权侵犯请与我们联系,我们将及时更正、删除。
▌相关推荐
OpenHarmony - 基于ArkUI框架实现日历应用
前言对于刚刚接触OpenHarmony应用开发的开发者,最快的入门方式就是开发一个简单的应用,下面记录了一个日历应用的开发过程,通过日历应用的开发,来熟悉基本图形的绘制,ArkUI的组件...【详细内容】
2024-01-16  Search: OpenHarmony  点击:(54)  评论:(0)  加入收藏
OpenHarmony4.0发布:新增4000多个API接口,交互及隐私能力增强
钛媒体App 11月6日消息,以“技术筑生态,智联赢未来”为主题的第二届OpenHarmony技术大会在北京举办,活动中,OpenHarmony 4.0版本正式发布。据介绍,OpenHarmony4.0版本开发套件同...【详细内容】
2023-11-07  Search: OpenHarmony  点击:(139)  评论:(0)  加入收藏
OpenHarmony,奏响中国基础软件的“光辉岁月”
梦想需要多久的时间,多少血和泪,才能慢慢实现?天地间任我展翅高飞,谁说那是天真的预言?《光辉岁月》歌词中的这两个问题,恰好可以送给今天的中国基础软件事业。曾几何时,我们认为中...【详细内容】
2023-11-07  Search: OpenHarmony  点击:(101)  评论:(0)  加入收藏
OpenHarmony:如何使用HDF驱动控制LED灯
一、程序简介该程序是基于OpenHarmony标准系统编写的基础外设类:RGB LED。目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网:https://gitee.com/Lockzhiner-Electronics/...【详细内容】
2023-09-08  Search: OpenHarmony  点击:(263)  评论:(0)  加入收藏
深入了解华为OpenHarmony开源系统的架构与功能
当下最火的科技圈新闻,莫过于华为即将发布的Mate 60系列手机,但是今天摸鱼君不讲这些,毕竟我也没抢到,我也不是专业测评。但是以我所长说说它搭载鸿蒙系统的一些内容。 鸿蒙系...【详细内容】
2023-09-07  Search: OpenHarmony  点击:(208)  评论:(0)  加入收藏
OpenHarmony中使用MQTT
MQTT**(**消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而...【详细内容】
2023-08-29  Search: OpenHarmony  点击:(432)  评论:(0)  加入收藏
OpenHarmony组件复用示例
OpenHarmony组件复用示例 摘要:在开发应用时,有些场景下的自定义组件具有相同的组件布局结构,仅有状态变量等承载数据的差异。这样的组件缓存起来,需要使用到该组件时直接复用,...【详细内容】
2023-08-28  Search: OpenHarmony  点击:(352)  评论:(0)  加入收藏
OpenHarmony运行docker详细步骤
本文将介绍如何在OpenHarmony内核上运行docker容器。 目录 1.环境和设备 2.准备支持Docker容器的OpenHarmony内核 3.编译烧录镜像 4.安装docker容器引擎组件 5.格式...【详细内容】
2023-07-28  Search: OpenHarmony  点击:(399)  评论:(0)  加入收藏
OpenHarmony 3.2 Release新特性解读之驱动HCS
HCS(HDF Configuration Source)是HDF驱动框架的配置描述源码,内容以Key-Value为主要形式。它实现了配置代码与驱动代码解耦,便于开发者进行配置管理。OpenAtom OpenHarmony(以下...【详细内容】
2023-06-01  Search: OpenHarmony  点击:(328)  评论:(0)  加入收藏
OpenHarmony系统之Service代码一键生成工具介绍
作者:苟晶晶前言当开发者为OpenHarmony系统框架开发某些功能时,有时需要将这个功能包装成一个独立的服务进程运行在系统中,为了其它应用进程能够调用此服务,开发人员需要基于系...【详细内容】
2023-05-31  Search: OpenHarmony  点击:(287)  评论:(0)  加入收藏
▌简易百科推荐
OpenHarmony - 基于ArkUI框架实现日历应用
前言对于刚刚接触OpenHarmony应用开发的开发者,最快的入门方式就是开发一个简单的应用,下面记录了一个日历应用的开发过程,通过日历应用的开发,来熟悉基本图形的绘制,ArkUI的组件...【详细内容】
2024-01-16    51CTO  Tags:OpenHarmony   点击:(54)  评论:(0)  加入收藏
鸿蒙工程师,熬来了「造富时代」
  作者|张俊  来源|新浪科技  ID|techsina  “套壳安卓”的质疑言犹在耳,如今华为正在计划将鸿蒙OS与安卓完全脱离。  此前,鸿蒙OS为了迅速扩大用户规模,采取了兼容安卓...【详细内容】
2023-11-20    锌财经  Tags:鸿蒙   点击:(213)  评论:(0)  加入收藏
OpenHarmony:如何使用HDF驱动控制LED灯
一、程序简介该程序是基于OpenHarmony标准系统编写的基础外设类:RGB LED。目前已在凌蒙派-RK3568开发板跑通。详细资料请参考官网:https://gitee.com/Lockzhiner-Electronics/...【详细内容】
2023-09-08    51CTO  Tags:OpenHarmony   点击:(263)  评论:(0)  加入收藏
深入了解华为OpenHarmony开源系统的架构与功能
当下最火的科技圈新闻,莫过于华为即将发布的Mate 60系列手机,但是今天摸鱼君不讲这些,毕竟我也没抢到,我也不是专业测评。但是以我所长说说它搭载鸿蒙系统的一些内容。 鸿蒙系...【详细内容】
2023-09-07  摸鱼IT  微信公众号  Tags:OpenHarmony   点击:(208)  评论:(0)  加入收藏
鸿蒙操作系统开发 搭建环境
2019年8月9日,华为在东莞举行华为开发者大会,正式发布鸿蒙操作系统;2020年9月推出了鸿蒙2.0,全面使能全场景生态,具备跨设备、服务流转、极速直达、可视可说、隐私安全五大能力。...【详细内容】
2023-09-07  清华计算机学堂  微信公众号  Tags:鸿蒙   点击:(198)  评论:(0)  加入收藏
OpenHarmony中使用MQTT
MQTT**(**消息队列遥测传输)是ISO 标准(ISO/IEC PRF 20922)下基于发布/订阅范式的消息协议。它工作在TCP/IP协议族上,是为硬件性能低下的远程设备以及网络状况糟糕的情况下而...【详细内容】
2023-08-29    51CTO  Tags:OpenHarmony   点击:(432)  评论:(0)  加入收藏
OpenHarmony组件复用示例
OpenHarmony组件复用示例 摘要:在开发应用时,有些场景下的自定义组件具有相同的组件布局结构,仅有状态变量等承载数据的差异。这样的组件缓存起来,需要使用到该组件时直接复用,...【详细内容】
2023-08-28  zhushangyuan  51CTO  Tags:OpenHarmony   点击:(352)  评论:(0)  加入收藏
HarmonyOS开发第一步,熟知开发工具DevEco Studio
俗话说的好,工欲善其事,必先利其器,走进HarmonyOS第一步,开发工具必须先行,当然了,关于开发工具的使用,官网和其他的博客也有很多的讲解,但是并没有按照常用的功能进行概述,如果需要...【详细内容】
2023-08-22  程序员一鸣  今日头条  Tags:HarmonyOS   点击:(205)  评论:(0)  加入收藏
鸿蒙元服务开发实例:桌面卡片上的电动自行车助手E-Bike
E-Bike是一款基于HarmonyOS开发的元服务,以万能卡片的形式给骑行提供便捷服务。首先需要完成HarmonyOS开发环境搭建。一、元服务E-Bike简介E-Bike是一款基于HarmonyOS开发的...【详细内容】
2023-08-16    51CTO  Tags:鸿蒙   点击:(302)  评论:(0)  加入收藏
OpenHarmony运行docker详细步骤
本文将介绍如何在OpenHarmony内核上运行docker容器。 目录 1.环境和设备 2.准备支持Docker容器的OpenHarmony内核 3.编译烧录镜像 4.安装docker容器引擎组件 5.格式...【详细内容】
2023-07-28  离北况归  51CTO  Tags:OpenHarmony   点击:(399)  评论:(0)  加入收藏
站内最新
站内热门
站内头条