鸿蒙(HarmonyOS)应用开发指南

news2025/2/26 7:33:03

1. 概述

1.1 简介

鸿蒙(即 HarmonyOS ,开发代号 Ark,正式名称为华为终端鸿蒙智能设备操作系统软件)是华为公司自 2012 年以来开发的一款可支持鸿蒙原生应用和兼容 AOSP 应用的分布式操作系统。该系统利用“分布式”技术将手机、电脑、平板、电视、汽车和智能穿戴等多款设备融合成一个“超级终端”,使用户便于操作和共享各种设备的资源。

1.2 本文读者收获

  • 帮助开发者全面了解 HarmonyOS 系统

  • 引导开发者从 0 到 1 上手 HarmonyOS 应用开发

1.3 鸿蒙开发基础

1.3.1 鸿蒙应用开发框架概述

鸿蒙应用开发框架是鸿蒙系统提供的一套开发工具和框架,用于帮助开发者快速构建鸿蒙应用。它提供了一系列的 API 和组件,使开发者可以方便地进行应用的开发、测试和发布。鸿蒙应用开发框架支持多种开发语言,包括 Java、C++、JavaScript、ArkTS 等,开发者可以根据自己的需求选择合适的开发语言进行开发。

1.3.2 鸿蒙应用开发框架的主要特点

跨平台开发:鸿蒙应用开发框架支持多种平台,包括手机、平板、电视、汽车等,开发者可以使用同一套代码开发适配不同平台的应用,大大提高了开发效率。

模块化开发:鸿蒙应用开发框架采用模块化的设计,开发者可以根据需要选择所需的功能模块进行开发,避免了不必要的代码冗余,提高了代码的可维护性和可重用性。

灵活的布局和界面设计:鸿蒙应用开发框架提供了丰富的布局和界面设计工具,开发者可以灵活地设计应用的界面,实现丰富多样的交互效果,提升用户体验。

强大的性能优化和调试工具:鸿蒙应用开发框架提供了一系列的性能优化和调试工具,开发者可以通过这些工具对应用进行性能优化和调试,提高应用的运行效率和稳定性。

1.3.3 语言和开发范式概念

当我们首次创建鸿蒙程序时,会面临模型的选择,如下图:

075f2a2f3caf733514f54afa944a005e.png

HarmonyOS 中的两种开发范式:

名称语言生态UI 更新方式适用场景适用人群
声明式开发范式ArkTS数据驱动更新复杂度较大、团队合作度较高的程序移动系统应用开发人员、系统应用开发人员
类 Web 开发范式JS数据驱动更新界面较为简单的程序应用和卡片Web 前端开发人员

语言选择

  • ArkTS:只支持 Stage 模型

  • JS:支持 Stage 模型 和 FA 模型

模型概念

HarmonyOS 的两种模型,是历史的产物,可以理解为设计模式。

FA(Feature Ability)模型:HarmonyOS API 7 开始支持的模型,已经不再主推。FA 模型开发可见 FA 模型开发概述。

Stage 模型:HarmonyOS API 9 开始新增的模型,是目前主推且会长期演进的模型。在该模型中,由于提供了 AbilityStage、WindowStage 等类作为应用组件和 Window 窗口的“舞台”,因此称这种应用模型为 Stage 模型。Stage 模型开发可见Stage 模型开发概述。Stage 模型架构如下图:

7a67f4458f6b106835ce5af898f60e7d.png
Stage模型概念图
  • 目前官方主推 Stage 模型

  • 针对 Stage 模型衍生出的声明式开发更优的开发框架

  • ArkTS 优于 JS

  • 我们认为,以上选型是目前(SDK 3.1.0 API 9)最优解/最佳实践即:Stage 模型+ArkTS+声明式。

2. 鸿蒙应用开发环境搭建

2.1 安装鸿蒙 DevEco Studio

步骤 1:下载 DevEco Studio SDK https://developer.harmonyos.com/cn/develop/deveco-studio#download

2.2 配置开发环境

2.2.1 (可选)配置 Proxy

步骤 2:网络不能直接访问 Internet,可通过设置代理服务器进行访问。如果无需代理即可访问 Internet,将跳过该步骤。

2.2.2 安装 Node.js 和 ohpm

步骤 3:指定本地已安装的 Node.js/ohpm,或在线下载安装 Node.js 与 ohpm。可以指定本地已安装的 Node.js 或 ohpm(Node.js 版本要求为 v14.19.1 及以上,且低于 v17.0.0;对应的 npm 版本要求为 6.14.16 及以上)路径位置;如果本地没有合适的版本,可以选择 Install 按钮,选择下载源和存储路径后,进行在线下载,单击 Next 进入下一步。

2.2.3 下载 HarmonyOS SDK
4bf914c984400520b4786f19be7ee730.png
2.2.4 创建鸿蒙应用
1d25e2a43a768f155c22b51c8c838052.png
2.2.5 运行项目

单击 DevEco Studio 工具栏中的按钮 ▶️ 运行工程,或使用默认快捷键 Shift+F10( macOS 为 Control+R )运行工程。

3. 开发指南

3.1 项目与配置

3.1.1 项目结构
89b04450a528f3279d5a012006d58156.png
项目结构
3.1.2 配置文件含义

AppScope > app.json5:应用的全局配置信息。

entry:HarmonyOS 工程模块,编译构建生成一个 HAP 包。

  • src > main > ets:用于存放 ArkTS 源码。

  • src > main > ets > entryability:应用/服务的入口。

  • src > main > ets > pages:应用/服务包含的页面。

  • src > main > resources:用于存放应用/服务所用到的资源文件,如图形、多媒体、字符串、布局文件等。关于资源文件,详见资源分类与访问。

  • src > main > module.json5:Stage 模型模块配置文件。主要包含 HAP 包的配置信息、应用/服务在具体设备上的配置信息以及应用/服务的全局配置信息。具体的配置文件说明,详见 module.json5 配置文件。

  • build-profile.json5:当前的模块信息、编译信息配置项,包括 buildOption、targets 配置等。其中 targets 中可配置当前运行环境,默认为 HarmonyOS。

  • hvigorfile.ts:模块级编译构建任务脚本,开发者可以自定义相关任务和代码实现。

  • oh_modules:用于存放三方库依赖信息。关于原 npm 工程适配 ohpm 操作,请参考历史工程迁移。

  • build-profile.json5:应用级配置信息,包括签名、产品配置等。

  • hvigorfile.ts:应用级编译构建任务脚本。

3.2 ArkUI 框架

3.2.1 ArkUI 定义

ArkTS 是 HarmonyOS 优选的主力应用开发语言,在 TS 基础上发展而来。基于 ArkTS 的声明式开发范式的方舟开发框架是一套开发极简、高性能、支持跨设备的 UI 开发框架,提供了构建 HarmonyOS 应用 UI 所必需的能力。

e2cdf7ffc3cb6068ab8494f8884eb867.png
ArkUI框架架构
3.2.2 ArkTS 声明式 UI 的基本组成
879e864d69406f74d15d3d14a3731104.png
ArkTS的基本组成
3.2.3 ArkTS 特点
  • 开发效率高,开发体验好

  • 性能优越

  • 生态容易快速推进

3.3 组件与布局汇总(API 9)

3.3.1 汇总
950a8a9fed2bc61a7462414a4cc8a0c1.png
3.3.2 XComponent 的使用

ArkUI 框架提供了基于 XComponent 组件的 C++ 自绘制引擎接入(比如游戏引擎)能力,和基于 Web 组件的 HTML5/Web 的渲染能力。满足了开发者在游戏、相机、地图、浏览器等复杂应用场景的开发诉求,降低了这类应用移植的门槛。

XComponent({id:'',type:'texture',librayname:'nativerender'})
.onload((context)=>{

})
.onDestroy(()=>{

})

3.4 界面开发

3.4.1 网络请求
  • @ohos.net.http(API6)

  • @system.fetch(API3)

完整示例

// 引入包名
import http from '@ohos.net.http';

// 每一个httpRequest对应一个HTTP请求任务,不可复用
let httpRequest = http.createHttp();
// 用于订阅HTTP响应头,此接口会比request请求先返回。可以根据业务需要订阅此消息
// 从API 8开始,使用on('headersReceive', Callback)替代on('headerReceive', AsyncCallback)。8+
httpRequest.on('headersReceive', (header) => {
    console.info('header: ' + JSON.stringify(header));
});
httpRequest.request(
    // 填写HTTP请求的URL地址,可以带参数也可以不带参数。URL地址需要开发者自定义。请求的参数可以在extraData中指定
    "EXAMPLE_URL",
    {
        method: http.RequestMethod.POST, // 可选,默认为http.RequestMethod.GET
        // 开发者根据自身业务需要添加header字段
        header: {
            'Content-Type': 'application/json'
        },
        // 当使用POST请求时此字段用于传递内容
        extraData: {
            "data": "data to send",
        },
        expectDataType: http.HttpDataType.STRING, // 可选,指定返回数据的类型
        usingCache: true, // 可选,默认为true
        priority: 1, // 可选,默认为1
        connectTimeout: 60000, // 可选,默认为60000ms
        readTimeout: 60000, // 可选,默认为60000ms
        usingProtocol: http.HttpProtocol.HTTP1_1, // 可选,协议类型默认值由系统自动指定
    }, (err, data) => {
        if (!err) {
            // data.result为HTTP响应内容,可根据业务需要进行解析
            console.info('Result:' + JSON.stringify(data.result));
            console.info('code:' + JSON.stringify(data.responseCode));
            // data.header为HTTP响应头,可根据业务需要进行解析
            console.info('header:' + JSON.stringify(data.header));
            console.info('cookies:' + JSON.stringify(data.cookies)); // 8+
            // 取消订阅HTTP响应头事件
            httpRequest.off('headersReceive');
            // 当该请求使用完毕时,调用destroy方法主动销毁
            httpRequest.destroy();
        } else {
            console.info('error:' + JSON.stringify(err));
            // 取消订阅HTTP响应头事件
            httpRequest.off('headersReceive');
            // 当该请求使用完毕时,调用destroy方法主动销毁。
            httpRequest.destroy();
        }
    }
);
3.4.2 数据存储
  • @ohos.data.storage(轻量)

  • @ohos.data.rdb(关系型数据库)

  • @ohos.data.distributedData(分布式数据管理)

  • 数据存储分类概念图

027eb35dcadf9facb1e599502c88894a.png
数据存储分类
3.4.3 页面路由
  • @ohos.router(API8)

  • @system.router(API3)

// index页面
export default {
indexPushPage() {
  router.push({
    uri: 'pages/detail/detail'
  });
}
}
3.4.4 app 模块
  • @system.app(API3)

3.5 权限管理

3.5.1 应用权限管理

HarmonyOS 中 所有的应用均在应用沙盒内运行。默认情况下,应用只能访问有限的系统资源,系统负责管理应用对资源的访问权限。

应用权限管理是由接口提供方(Ability)、接口使用方(应用)、系统(包括云侧和端侧)以及用户等多方共同参与的整个流程,保证受限接口是在约定好的规则下被正常使用,避免接口被滥用而导致用户、应用和设备受损。

3.5.2 敏感权限

涉及访问个人数据(如:照片、通讯录、日历、本机号码、短信等)和操作敏感能力(如:相机、麦克风等)的权限。

3.5.3 权限申请过程
//1.定义
{
    "module": {
        "reqPermissions": [
            {
                "name": "ohos.permission.CAMERA",
                "reason": "$string:permreason_camera",
                "usedScene":
                {
                    "ability": ["com.mycamera.Ability", "com.mycamera.AbilityBackground"],
                    "when": "always"
                }
            },{
            ...
            }
        ]
    }
}
  • name : 必须,填写需要使用的权限名称。

  • reason: 失败原因,可选,当申请的权限为 user_grant 权限时此字段必填。

  • usedScene:可选,当申请的权限为 user_grant 权限时此字段必填。描述权限使用的场景和时机。场景类型有:ability、when(调用时机)。可配置多个 ability。

3.5.4 动态申请
//2. 动态申请
  if (verifySelfPermission("ohos.permission.CAMERA") != IBundleManager.PERMISSION_GRANTED) {
    // 应用未被授予权限
    if (canRequestPermission("ohos.permission.CAMERA")) {
        // 是否可以申请弹框授权(首次申请或者用户未选择禁止且不再提示)
        requestPermissionsFromUser(
                new String[] { "ohos.permission.CAMERA" } , MY_PERMISSIONS_REQUEST_CAMERA);
    } else {
        // 显示应用需要权限的理由,提示用户进入设置授权
    }
} else {
    // 权限已被授予
}
3.5.5 权限使用原则
  • 权限申请最小化。跟用户提供的功能无关的权限,不要申请;尽量采用其他无需权限的操作来实现相应功能(如:通过 intent 拉起系统 UI 界面由用户交互、应用自己生成 uuid 代替设备 ID 等)。

  • 权限申请完整。应用所需权限(包括应用调用到的三方库依赖的权限)都要逐个在应用的 config.json 中按格式声明。

  • 满足用户可知。应用申请的敏感权限的目的需要真实准确告知用户。

  • 权限就近申请。应用在用户触发相关业务功能时,就近提示用户授予实现此功能所需的权限。

  • 权限不扩散。在用户未授权的情况下,不允许提供给其他应用使用。

  • 应用自定义权限防止重名。建议以包名为前缀来命名权限,防止跟系统定义的权限重名。

3.6 状态管理

3.6.1 状态管理双向交互
24ebd7b8cdacad520bc56e2efbd32d4d.png
双向
3.6.2 @State 使用
@Component
struct MyComponent {
  @State count: number = 0;
  private increaseBy: number = 1;

  build() {
  }
}

@Component
struct Parent {
  build() {
    Column() {
      // 从父组件初始化,覆盖本地定义的默认值
      MyComponent({ count: 1, increaseBy: 2 })
    }
  }
}
3.6.3 Components 级别的状态管理
  • @State:@State 装饰的变量拥有其所属组件的状态,可以作为其子组件单向和双向同步的数据源。当其数值改变时,会引起相关组件的渲染刷新。

  • @Prop:@Prop 装饰的变量可以和父组件建立单向同步关系,@Prop 装饰的变量是可变的,但修改不会同步回父组件。

  • @Link:@Link 装饰的变量和父组件构建双向同步关系的状态变量,父组件会接受来自 @Link 装饰的变量的修改的同步,父组件的更新也会同步给 @Link 装饰的变量。

  • @Provide/@Consume:@Provide/@Consume 装饰的变量用于跨组件层级(多层组件)同步状态变量,可以不需要通过参数命名机制传递,通过 alias(别名)或者属性名绑定。

  • @Observed:@Observed 装饰 class,需要观察多层嵌套场景的 class 需要被 @Observed 装饰。单独使用 @Observed 没有任何作用,需要和 @ObjectLink、@Prop 连用。

  • @ObjectLink:@ObjectLink 装饰的变量接收 @Observed 装饰的 class 的实例,应用于观察多层嵌套场景,和父组件的数据源构建双向同步。

8c0d9f903bd9a4f6910fc3be405269d0.png
Components装饰器
  • @StorageLink/@LocalStorageLink 实现应用和组件状态的双向同步,通过@StorageProp/@LocalStorageProp 实现应用和组件状态的单向同步

  • 其他状态装饰器

    • @Watch 用于监听状态变量的变化

3.7 线程通信

  • HarmonyOS 应用中每个进程都会有一个主线程,其中主线程作用如下:

  1. 执行 UI 绘制;

  2. 管理主线程的 ArkTS 引擎实例,使多个 UIAbility 组件能够运行在其之上;

  3. 管理其他线程(例如 Worker 线程)的 ArkTS 引擎实例,例如启动和终止其他线程;

  4. 分发交互事件;

  5. 处理应用代码的回调,包括事件处理和生命周期管理;

  6. 接收 Worker 线程发送的消息;

  • 主线程之外,用户最多可以创建 8 个子线程

a6848619388d218344b58c448c44d276.png
子线程与主线程
  • 主线程与子线程通信:

使用 EmitterEmitter:订阅和发送发送事件

import emitter from "@ohos.events.emitter";
// 订阅eventId为1的事件
emitter.on({eventId: 1}, callback);
// 发送eventId为1的事件,事件内容为eventData
emitter.emit(event, eventData);

使用 Worker 进行通信

// 1.在工程的模块级build-profile.json5文件的buildOption属性中添加配置信息
"buildOption": {
    "sourceOption": {
      "workers": [
        "./src/main/ets/workers/worker.ts"
      ]
    }
  }
// 2.根据build-profile.json5中的配置创建对应的worker.ts文件。
import worker from '@ohos.worker';

let parent = worker.workerPort;

// 处理来自主线程的消息
parent.onmessage = function(message) {
    console.info("onmessage: " + message)
    // 发送消息到主线程
    parent.postMessage("message from worker thread.")
}

// 3.主线程中使用如下方式初始化和使用worker (Stage模型)
import worker from '@ohos.worker';

let wk = new worker.ThreadWorker("entry/ets/workers/worker.ts");

// 发送消息到worker线程
wk.postMessage("message from main thread.")

// 处理来自worker线程的消息
wk.onmessage = function(message) {
    console.info("message from worker: " + message)

    // 根据业务按需停止worker线程
    wk.terminate()
}

3.8 进程通信

3.8.1 进程通信两种实现
  • IPC(Inter-Process Communication)

    • 使用 Binder 驱动

  • RPC(Remote Procedure Call)

    • 使用软总线驱动

3.8.2 实现步骤
  • 实现接口类:需继承 IRemoteBroker,需定义消息码,可声明不在此类实现的方法。

  • 实现服务提供端(Stub):需继承 IRemoteStub 或者 RemoteObject,需重写 AsObject 方法及 OnRemoteRequest 方法。

  • 实现服务请求端(Proxy):需继承 IRemoteProxy 或 RemoteProxy,需重写 AsObject 方法,封装所需方法调用 SendRequest。

  • 注册 SA:申请 SA 的唯一 ID,向 SAMgr 注册 SA。

  • 获取 SA:通过 SA 的 ID 和设备 ID 获取 Proxy,使用 Proxy 与远端通信

c561b65c505bcb27fda0bb7bc78329dd.png
image.png

3.9 设备唯一标识

  • Oaid:它是基于华为自由算法生成的 UUID 标识符,同一台设备上不同 App 获取的 Oaid 一致;

  • NetworkID:网络设备节点通信标识符(重启后变化)

  • DVID:分布式虚拟设备标识符(需要登录 HarmonyOS 账号)

  • UUID:同一时空下所有设备生成的 UUID 都不同

3.10 适配

3.10.1 国际化
  1. 导入 I18n 模块。

    import I18n from '@ohos.i18n';
  2. 判断 Locale 的语言是否为从右到左语言。

    调用 isRTL 接口获取 Locale 的语言是否为从右到左语言。

    try {
       let rtl = I18n.isRTL("zh-CN"); // rtl = false
       rtl = I18n.isRTL("ar"); // rtl = true
    } catch(error) {
       console.error(`call i18n.System interface failed, error code: ${error.code}, message: ${error.message}`);
    }
  3. 获取语言的本地化表示。

    调用 getDisplayLanguage 接口获取某一语言的本地化表示。其中, language 表示待本地化显示的语言,locale 表示本地化的 Locale, sentenceCase 结果是否需要首字母大写。

    try {
       let language = "en";
       let locale = "zh-CN";
       let sentenceCase = false;
       let localizedLanguage = I18n.System.getDisplayLanguage(language, locale, sentenceCase); // localizedLanguage = "英语"
    } catch(error) {
       console.error(`call i18n.System interface failed, error code: ${error.code}, message: ${error.message}`);
    }
  4. 获取国家的本地化表示。

    调用 getDisplayCountry 接口获取某一国家的本地化表示。其中,country 表示待本地化显示的国家,locale 表示本地化的 Locale,sentenceCase 结果是否需要首字母大写。

    try {
       let country = "US";
       let locale = "zh-CN";
       let sentenceCase = false;
       let localizedCountry = I18n.System.getDisplayCountry(country, locale, sentenceCase); // localizedCountry = "美国"
    } catch(error) {
       console.error(`call i18n.System interface failed, error code: ${error.code}, message: ${error.message}`);
    }
  5. 获取系统语言列表和某个语言系统支持的国家列表。

    调用 getSystemLanguages 接口获取系统支持的语言列表。

    调用 getSystemCountries 接口获取某一语言系统支持的地区列表。

    try {
       let languageList = I18n.System.getSystemLanguages();  // languageList = ["en-Latn-US", "zh-Hans"]
       let countryList = I18n.System.getSystemCountries("zh"); // countryList = ["ZW", "YT", ..., "CN", "DE"], 共240个国家和地区
    } catch(error) {
       console.error(`call i18n.System interface failed, error code: ${error.code}, message: ${error.message}`);
    }
  6. 判断语言和国家是否匹配。

    调用 isSuggested 接口判断语言和地区是否匹配。

    try {
       let isSuggest = I18n.System.isSuggested("zh", "CN"); // isSuggest = true
    } catch(error) {
       console.error(`call i18n.System interface failed, error code: ${error.code}, message: ${error.message}`);
    }
3.10.2 屏幕适配
  • 百分比

  • 根据 dpi 动态计算(算法)

  • 全局定义(src/main/resources/base/element/ float.json)

// 定义
{
  "float": [
    {
      "name": "btn_height",
      "value": "40vp"
    },
    {
      "name": "value_height",
      "value": "28vp"
    }
  ]
}
// 引用
 Button($r('app.string.pixel_introduce'))
        .height($r('app.float.btn_height'))
        .width(Constants.FULL_PERCENT)
        .backgroundColor($r('app.color.blue_background'))
        .onClick(() => this.jumpPage(Constants.INTRODUCTION_PAGE_URL))
3.10.3 其他适配(暗黑模式等)

New->Resource File,在弹出的界面选择 Color Mode 来创建如下图

1eddc163241b1c8f6e11f8fb641e5823.png
签名上架流程

4.应用测试

4.1 测试标准

  • 性能测试

  • 安全测试

  • 兼容性测试

  • 稳定性测试

  • 功耗测试

  • 流转测试

  • 游戏测试

4.2 测试服务

4.2.1 单元测试框架
  1. 框架概述:单元测试框架(hypium)是 HarmonyOS 上的测试框架,提供测试用例编写、执行、结果显示能力,用于测试系统或应用接口。

  2. 测试框架引用方式:目前 hypium 以 npm 包的形式发布, 因此需要在 Deveco Studio 工程级 package.json 内配置。

"dependencies": {
  "@ohos/hypium": "1.0.6" #最新版本号,可通过cmd命令"npm view @ohos/hypium version"查询
}
  1. 使用

import { describe, beforeAll, beforeEach, afterEach, afterAll, it, expect } from '@ohos/hypium'
export default function abilityTest() {
  describe('ActsAbilityTest', function () {
    it('assertContain',0, function () {
      let a = 'abc'
      let b = 'b'
      // Defines a variety of assertion methods, which are used to declare expected boolean conditions.
      expect(a).assertContain(b)
      expect(a).assertEqual(a)
    })
  })
}

5. 应用发布与测试

5.1 签名与上架流程图

cded7bd4949036321583cce2f466c860.png
签名上架流程

6. 参考资料和资源

  • https://developer.harmonyos.com/cn/docs/documentation/doc-guides-V3/deveco_overview-0000001053582387-V3

  • https://developer.harmonyos.com/cn/develop/deveco-studio#download

  • https://nodejs.org/en

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1383004.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

centos 7 上如何安装chrome 和chrome-driver

centos 7 上如何安装chrome 和chrome-driver 查找自己的服务器是什么系统 cat /etc/os-release这里以centos linux 7为例 下载google-chrome安装包 wget https://dl.google.com/linux/direct/google-chrome-stable_current_x86_64.rpm安装chrome sudo yum localinstall go…

C++ 输入用户名和密码 防止注入攻击

1、问题解释:注入攻击 ,无密码直接登录数据库 可视化展示 1.1、当你的数据库为:其中包含三个字段id user 以及md5密码 1.2、在使用C堆数据库信息进行访问的时候,使用多条语句进行查询 string sql "select id from t_user…

阿里云最新优惠券领取方法及优惠活动汇总

随着互联网的飞速发展,云服务已经成为企业和个人使用的重要基础设施。阿里云作为全球领先的云服务提供商,一直致力于为用户提供优质的云服务。为了回馈用户,阿里云会定期推出各种优惠券和优惠活动,本文将为大家介绍阿里云最新优惠…

Unity中的异步编程【7】——在一个异步方法里播放了animation动画,取消任务时,如何停止动画播放

用一个异步方法来播放一个动画,正常情况是:动画播放结束时,异步方法宣告结束。那如果我提前取消这个异步任务,那在这个异步方法里面,我要怎么停止播放呢?! 一、播放animation动画的异步实现 1…

医疗器械网络安全风险评定CVSS打分

为了完成医疗器械软件的网络安全风险评定相关文档,需要进行CVSS评分,这个评分对于第一次做的人来说感觉还是有些迷惑的,查了一些资料,留作参考。 CVSS 指的是 Common Vulnerability Scoring System,即通用漏洞评分系统…

七、HorizontalPodAutoscaler(HPA)

目录 一、HPA概述: 二、HPA工作机制: 三、HPA流程: 四、HPA API对象: 五、示例: 1、基于CPU的HPA 2、常见问题: 3、基于内存的HPA 一、HPA概述: Horizontal Pod Autoscaler,中文就是水平自动伸缩可…

JUC02同步和锁

同步&锁 相关笔记:www.zgtsky.top 临界区 临界资源:一次仅允许一个进程使用的资源成为临界资源 临界区:访问临界资源的代码块 竞态条件:多个线程在临界区内执行,由于代码的执行序列不同而导致结果无法预测&am…

mysql清空并重置自动递增初始值

需求:当上新项目时,测试环境数据库导出来的表id字段一般都有很大的初始递增值了,需要重置一下 先上代码: -- 查看当前自动递增值 SHOW CREATE TABLE table_name; -- 重建自动递增索引(可选) ALTER TABLE t…

初学者的基本 Python 面试问题和答案

文章目录 专栏导读1、什么是Python?列出 Python 在技术领域的一些流行应用。2、在目前场景下使用Python语言作为工具有什么好处?3、Python是编译型语言还是解释型语言?4、Python 中的“#”符号有什么作用?5、可变数据类型和不可变…

【深度学习:Micro-Models】用于标记图像和视频的微模型简介

【深度学习:Micro-Models】用于标记图像和视频的微模型简介 微模型:起源故事微模型到底是什么?更详细地解释微观模型:一维标签蝙蝠侠效率 在计算机视觉项目中使用微模型的额外好处面向数据的编程 在本文中,我们将介绍 …

qt5.14.2配置opencv4.5.5

使用环境:windows,opencv4.5.5,qt5.14.2,msvc编译器 这里的opencv文件是已经编译好了,在qt工程中配置就可使用,编译器得是msvc才行,MinGW不管用。 资源地址:https://download.csdn.…

【年终总结】回首2023的精彩,迈向2024的未来

文章目录 一、历历在目,回首成长之路🏃‍1、坚持输出,分享所学2、积土成山,突破万粉3、不断精进,向外涉足 二、雅俗共赏,阅历百般美好🎻1、音乐之声,声声入耳2、书海遨游&#xff0c…

10.9.2 std::function 代替函数指针

std::function是一个模板类&#xff0c;基本可作为函数指针的代替品&#xff0c;具备更多功能&#xff0c;特别是与函数对象及bind配合使用。使用std::function时&#xff0c;需要添加头文件 #include <functional> 1.定义函数指针 18行&#xff0c;定义了一个函数指针类…

ssm基于java的智能训练管理平台论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差&#x…

【位运算】【二分查找】【C++算法】100160价值和小于等于 K 的最大数字

作者推荐 【动态规划】【字符串】扰乱字符串 本文涉及的基础知识点 二分查找算法合集 位运算 LeetCode100160. 价值和小于等于 K 的最大数字 给你一个整数 k 和一个整数 x 。 令 s 为整数 num 的下标从1 开始的二进制表示。我们说一个整数 num 的 价值 是满足 i % x 0 且…

[书生·浦语大模型实战营]——XTuner 大模型单卡低成本微调

1.Finetune简介 在未经过微调的pretrained LLM中&#xff0c;模型只会尽量去拟合你的输入&#xff0c;也就是说模型并没有意识到你在提问&#xff0c;因此需要微调来修正。 1.1常用的微调模式 LLM的下游应用中,增量预训练和指令跟随是经常会用到的两种的微调模式。 增量预训练…

【前后端的那些事】解放后端!10min快速上手人人代码生成器(后端篇)

人人代码生成器【后端篇】 文章目录 人人代码生成器【后端篇】1. 克隆renren-generator2. 配置项目信息3. 配置数据库信息4. 启动项目5. 创建springboot项目5.1 pom.xml5.2 创建包结构5.3 编写application.yml5.4 将生成代码集成到项目中5.5 集成common模块5.6 启动项目 前言&a…

影响邮件打开率的因素有哪些?

影响邮件打开率得因素有很多&#xff0c;比如说邮件地址的有效性、邮件标题、定位人群、发送频率或者时间等因素。目前来讲&#xff0c;我们可以通过技术的手段改善邮件的到达率&#xff0c;但是邮件的打开率取决于收件人本身&#xff0c;所以发件人的发送动作如何在很大程度上…

一、Mindspore 公开课 - Transformer

课程链接&#xff1a;Mindspore 技术公开课 Transformer 论文地址&#xff0c;建议看完课程以后简单看看论文 前言 Transformer是一种神经网络结构&#xff0c;由Vaswani等人在2017年的论文“Attention Is All You Need” 中提出&#xff0c;用于处理机器翻译、语言建模和文…

PLAN B KRYPTO ASSETS GMBH CO. KG 普兰资产管理公司

引领加密技术不断演进 PLAN B KRYPTO ASSETS普兰资产管理以其独创的「Trident Strategy三叉戟模型」技术为基础&#xff0c;持续推动加密技术的发展&#xff0c;打造 Schutz&#xff08;舒茨盾&#xff09; AI 金融隐私匿名公链。致力于提供高效的技术服务&#xff0c;基于机构…