HarmonyOS面试题(持续更新中)
1、用过线程通信吗,线程是怎么进行通信的?
emitter 和 eventHub
相同:
都是基于事件总线的
区别是:
① eventHub当前线程内通信
② emitter是同一进程不同线程或者同一进程和同一线程也可以通信
2、页面和组件的生命周期
页面生命周期:
被@Entry装饰的组件生命周期,提供以下生命周期接口:
onPageShow:页面每次显示时触发一次,包括路由过程、应用进入前台等场景
onPageHide:页面每次隐藏时触发一次,包括路由过程、应用进入后台等场景。
onBackPress:当用户点击返回按钮时触发。
组件生命周期:
一般用@Component装饰的自定义组件的生命周期,提供以下生命周期接口:
aboutToAppear:组件即将出现时回调该接口,具体时机为在创建自定义组件的新实例后,在执行其build0函数之前执行
onDidBuild:组件build(函数执行完成之后回调该接口,不建议在onDidBuild函数中更改状态变量、使用animateTo等功能,这可能会导致不稳定的U表现。
aboutToDisappear:aboutToDisappear函数在自定义组件析构销毁之前执行。不允许在aboutToDisappear函数中改变状态变量,特别是@Link变量的修改可能会导致应用程序行为不稳定。
3、UiAbility的生命周期呢?
onCreate
onWindowStateCreate
onForground
onBackground
onDestroy
onNewWant - 拉起ability 如果ability已经存在的情况下,onNewWant会执行
4、弹窗UI是怎么在页面UI中使用的
① CustomtDialogController
② 创建子窗口的形式创建弹层
③ 弹层
bindSheet 半层
bindContentCover 全层
5、常用的修饰符有哪些
State Prop Link Provide Consume Observed ObjectLink Builder BuilderParams Styles
Extends Require Entry Component CustomDialog Watch StorageProp StorageLink
LocalStorageProp LocalStorageLink Track Prewview
6、buffer是什么与16进制和数组有什么关系吗
缓冲区(Buffer)是一种用于临时存储数据的内存区域,它可以是一个连续的内存块,用于临时保存数据。在编程中,缓冲区通常用于存储二进制数据,比如字节序列。 与 16 进制和数组的关系如下:
-
16 进制表示:在计算机中,数据以二进制形式存储。当我们需要查看或者处理二进制数据时,通常使用 16 进制表示。例如,一个字节的二进制数据可以用两个十六进制数字表示。
-
数组:缓冲区可以看作是一个数组,其中的元素是字节(或者其他数据类型,取决于缓冲区的类型)。通过数组的索引,我们可以访问和修改缓冲区中的数据。
7、Builder和BuilderParams的区别
Builder是当前组件的UI复用结构 BuilderParams是接收父组件传入的UI复用结构, 传过来的类型是UI复用结构类型
Builder传值 想要响应式必须是对象,如果基础数据类型,不具备响应式
8、对于一些公共的样式你是怎么做的?有没有什么优化的方式
-
封装组件
-
提取Builder
-
提取Styles和Extends
8、鸿蒙和安卓和IOS的区别
从宏观上说鸿蒙借鉴了安卓的componse框架和ios的swiftUI, flutter的链式调用,还借鉴了前端的ts。API有点像安卓,但是从系统封闭性更像ios
9、鸿蒙的刷新机制是怎么样的,多层嵌套时,是从build开始刷新吗
刷新机制只检测第一层数据变化,不论什么修饰符,从最外层开始,但是会进行比较,如果该属性数据没有变化,该层级不刷新。只要key发生了变化,就会更新- 如果不给key, 那么就会实现index_JSON.stringify(item)的方式 是从build开始刷新,但是并不是开始更新- 只有对应数据变化了 才会进行组件的销毁去重新创建
10、发布的应用用什么监控的日志呢
自带的log,可以监听,也可以写入文件,但是写入文件一般都有限, 我们一般都是监听崩溃日志,将日志上报我们的服务器,监听崩溃日志就是个API
11、webSocket用过吗?说说你在项目中怎么用的
主要用在发消息和接消息,用于客服模块的消息
ws = webSocket.createWebSocket()
ws.connect("url", () => { })
ws.on("open", () => { })
ws.on("message", () => { })
ws.on("close", () => { })
ws.send(JSON.stringify(content))
12、多线程woker与emite的区别是什么?是否能自动更新UI?worker最大的数量是多少?
Worker和TaskPool 不能更新UI 最大数量8个, 用完worker要销毁
13、不使用CustomDialog和条件渲染怎么实现一个像prompt.showToast的弹窗效果
使用创建subwindow的方式来实现。传入一个参数,设置窗口的宽度和高度,创建弹窗,通过loadContent加载一个UI页面,页面中传入参数
14、@Provide和@Consume的使用中,消费者修改了值,提供者那边会变化吗?
当然会,因为都是双向的
15、输入框获取焦点,弹出键盘会将页面推至屏幕外,想正常显示,应该怎么处理?
设置键盘的避让模式
windowStage.getMainWindowSync().getUIContext().setKeyboardAvoidMode(KeyboardAvoidMode.RESIZE)
16、页面转场是怎么实现的
动画 给图片一个id 设置一个属性,转场页面设置同一个id,既可以转场
17、客户端怎么实现长登陆的;再说说token的失效后是如何处理的?
-
token是登录之后得到的,如果失效应该去换取token,还应有一个refreshToken,
-
refreshToken换取一个新的token
-
如果换取成功-替换原有token-重启发请求
-
如果换取失败-删除token-删除refreshToken-跳转到登页有什么区别
18、除了har包和HSP包 还能打成什么包?
app- 综合包
har-静态包-会出现多次拷贝
hsp-共享包-只会有一次
hap- 带ability,只有它带
19、@Link和@Prop的区别
@Prop的数据是单向传递的,父组件改变能通知子组件,但是子组件改变不能通知父组件。
@Link的数据是双向传递的,父组件改变能通知子组件,子组件的改变也可以通知父组件。
20、 http是在主线程内还是另起一个线程?
http是在主线程内还是另起一个线程,每个请求通常都会由一个单独的线程来处理
21、Promise 异步、和TaskPool、Worker有什么区别吗
① Promise:异步仍然是在当前线程中运行任务,结果以异步方式返回
② TaskPool::对于一些耗时操作,使用Promise占用了主线程资源,可能会导致ANR,所以出现了taskPool来保证可以起子线程处理耗时操作。taskPool存活最长时间为3分钟,运行超过3分钟,那么会被系统杀掉。
③ Worker:存在一个特别耗时的操作,或者可能存在业务需要一直死循环运行。通过worker可以启动一个线程,该线程不存在时长限制,可以一直存在,所以我们可以在里边做一些耗时操作。worker线程最多可以在APP里同时存在8个一起运行,超出数量的不会运行。但是创建可以创建多个,所以当worker不需要的时候要及时停止运行。worker对内存有影响,每个空worker起来后就会占用2MB左右内存
22、多线程改变了主线程的值 那么主线程内的值会不会一起改变?
不会 。
主线程和子线程是独立运行的,它们拥有各自的栈空间。主线程和子线程在栈帧中保存的是各自的局部变量,这样就确保了它们的互不干扰。
23、TaskPool线程的数据怎么和主线程同步?
TaskPool的任务支持通过sendData接口触发主线程的onReceiveData回调,暂不支持主线程向子线程通信。
24、@Entry与@Component有什么区别?
@Entry装饰的自定义组件将作为UI页面的入口。在单个UI页面中,最多可以使用@Entry装饰一个自定义组件。
@Component装饰器仅能装饰struct关键字声明的数据结构。struct被@Component装饰后具备组件化的能力,需要实现build方法描述UI,一个struct只能被一个@Component装饰。
25、want的type和action参数是做什么的
Want的type和action参数主要用于指定操作类型和动作。
Type:参数用于指定数据类型,它告诉系统或应用程序如何处理或显示数据。
Action:参数代表了一系列预定义的操作,这些操作描述了Want对象的用途或目的。
26、性能优化有哪些?
一、使用并行化、预加载和缓存等方法,提升系统资源利用率,减少主线程负载,加快应用的启动速度和响应速。
① 使用多线程执行耗时操作
② 使用异步执行耗时操作
③ 使用预加载提升页面启动和响应速度
④ 使用条件渲染实现预加载
⑤ 使用缓存提升启动速度和滑动帧率
二、尽量减少布局的嵌套层数
① 移除冗余节点,删除无用的Stack/Column/Row嵌套
② 使用Column/Row替代Flex构建线性布局
③ 使用Flex、List、Grid、RelativeContainer、绝对布局和自定义布局等构建复杂布局
三、合理管理状态变量
① 合理管理状态变量,减少不必要的参数层次传递
② 避免滥用@Provide+@Consume
③ 控制对象级状态变量成员数量
④ 避免不必要的创建和读取状态变量
四、合理使用系统接口,避免冗余操作
① 避免在系统高频调用进行冗余和耗时操作
② 避免在系统高频调用打印日志
③ 在Release版本中删除Debug日志
五、使用性能工具分析和定位问题
27、@Entry 装饰的页面,A 页面跳到 B 页面后再跳回 A 页面,如何获取 B 页面的返回值
router.back({
url: 'pages/Home',
params: {
info: '来自Home页'
}
})// 这些参数可以在目标页面中
// 通过调用 router.getParams() 方法进行获取
onPageShow() {
const params = router.getParams() as Record<string, string>
console.log(params)
}
28、 如何实现给父组件传递子组件
使用 @BuilderParam
29、HarmonyOS应用打包后的文件扩展名是?
打包后的文件扩展名为.hap(HarmonyOS Ability Package),这是HarmonyOS应用的标准包格式
30、如何进行数据持久化?
用户首选项(Preferences):这是一种轻量级的配置数据持久化方式,适用于保存应用配置信息、用户偏好设置等。
键值型数据库(KV-Store):适用于存储结构简单的数据,如商品名称和价格、员工工号和出勤状态等。
关系型数据库(RelationalStore):基于SQLite,适用于存储包含复杂关系的数据,如学生信息、雇员信息等
31、如何进行全局状态管理?
@Provide+@Consume装饰器
适用场景:适用于整个组件树而言“全局”的状态共享,且该状态改动不频繁的场景。
AppStorage
适用场景:适用于整个应用而言“全局”的变量或应用的主线程内多个 UIAbility
实例间的状态共享。
LocalStorage
适用场景:适用于单个Ability而言“全局”的变量,主要用于不同页面间的状态共享。
32、LocalStorage在应用重启后数据会消失吗?
会,因为LocalStorage 是一种用于页面或组件级别的数据存储方式,它允许开发者在页面或组件的生命周期内存储和检索数据。LocalStorage 的数据存储在内存中,因此它的读写速度相对较快。但是,当应用重启后,LocalStorage 中的数据会丢失。
33、兄弟组件如何通信?
① 通过公共父组件传递
如果两个组件是同一个父组件的子组件,可以通过父组件来传递数据或事件。父组件可以作为中介,将一个子组件的数据或事件传递给另一个子组件。
② 使用全局状态管理
使用全局状态管理(如 AppStorage、LocalStorage)来存储共享数据。兄弟组件可以独立地读取和更新这个全局状态,从而实现通信。
34、 跨设备通信的方式有哪些?
- 分布式软总线:一种高性能的通信机制,允许设备之间建立直接连接,进行数据传输。
- 蓝牙:使用标准的蓝牙技术进行设备间的通信。
- WLAN:通过WLAN网络实现设备间的通信。
- 远程服务调用:通过分布式任务调度实现跨设备的服务调用。
35、LazyForEach是什么
LazyForEach 是一个用于高效渲染列表的组件或功能,它允许开发者在用户滚动列表时才加载和渲染列表项,而不是一次性渲染整个列表。这种按需渲染的方式可以显著提高应用的性能,特别是在处理大量数据时。
36、显示 want 和 隐式 want 的区别?
显式Want:在启动目标应用组件时,调用方传入的want参数中指定了abilityName和bundleName,称为显式Want。
隐式Want:在启动目标应用组件时,调用方传入的want参数中未指定abilityName,称为隐式Want。
37、 三层架构是什么?
三层架构为了“一次开发,多端部署”,项目结构采用三层架构
三层工程结构如下:
commons(公共能力层):用于存放公共基础能力集合(如工具库、公共配置等)。commons层可编译成一个或多个HAR包或HSP包,只可以被products和features依赖,不可以反向依赖。
features(基础特性层):开发页面、组件(HAR包或HSP包)。
products(产品定制层):定义phone\pad两个ability,引用 features 的包和 commons 的包完成应用功能
38、本地缓存,数据持久化
Preferences:用户首选项为应用提供Key-Value键值型的数据处理能力,支持应用持久化轻量级数据,并对其修改和查询。
AppStorage + PersistentStorage(应用全局的 UI 状态存储)
KVStore(键值型数据库)
RdbStore(关系型数据库)
fs(写文件)
相关文章:

HarmonyOS面试题(持续更新中)
1、用过线程通信吗,线程是怎么进行通信的? emitter 和 eventHub 相同: 都是基于事件总线的 区别是: ① eventHub当前线程内通信 ② emitter是同一进程不同线程或者同一进程和同一线程也可以通信 2、页面和组件的生命周期 …...

QT中QWidget和QObject的区别与联系是什么
在Qt框架中,QWidget和QObject是两个核心类,它们各自扮演着不同的角色,但又紧密相连。以下是关于它们区别与联系的详细解释: 区别 基类和功能定位: QObject是Qt中所有类的基类,包括几乎所有的Qt对象。它提供…...

解决macOS安装redis以后不支持远程链接的问题
参考文档:https://blog.csdn.net/qq_37703224/article/details/142542179?spm1001.2014.3001.5501 安装的时候有个提示, 使用指定配置启动: /opt/homebrew/opt/redis/bin/redis-server /opt/homebrew/etc/redis.conf那么我们可以尝试修改这个配置文件: code /opt/homebrew/…...

2024年研究生数学建模“华为杯”E题——肘部法则、k-means聚类、目标检测(python)、ARIMA、逻辑回归、混淆矩阵(附:目标检测代码)
文章目录 一、情况介绍二、思路情况二、代码展示三、感受 一、情况介绍 前几天也是参加了研究生数学建模竞赛(也就是华为杯),也是和本校的两个数学学院的朋友在网上组的队伍。昨天(9.25)通宵干完论文(一条…...

绝了,自从用了它,我每天能多摸鱼2小时!
大家好,我是可乐。 俗话说的好:“摸鱼一时爽,一直摸鱼一直爽”。 作为一个程序员,是否有过调试代码熬到深夜?是否有过找不到解决方案而挠秃头顶? 但现在你即将要解放了,用了这款工具——秘塔…...

C语言指针系列1——初识指针
祛魅:其实指针这块儿并不难,有人说难只是因为基础到进阶没有处理好,大家要好好跟着一步一步学习,今天我们先来认识一下指针 指针定义:指针就是内存地址,指针变量是用来存放内存地址的变量,在同一…...

传神论文中心|第26期人工智能领域论文推荐
在人工智能领域的快速发展中,我们不断看到令人振奋的技术进步和创新。近期,开放传神(OpenCSG)传神社区发现了一些值得关注的成就。传神社区本周也为对AI和大模型感兴趣的读者们提供了一些值得一读的研究工作的简要概述以及它们各自…...

NLP基础1
NLP基础1 深度学习中的NLP的特征输入 1.稠密编码(特征嵌入) 稠密编码(Dense Encoding):指将离散或者高纬的稀疏数据转化为低纬度的连续、密集向量表示 特征嵌入(Feature Embedding) 也称…...

001.docker30分钟速通版
docker简介 docker就是一个用于构建(build),运行(run),传送(share)应用程序的平台做一个不恰当的类比,就是外卖平台,如果你自己做华莱士不一定好吃࿰…...

Kafka 在 Linux 下的集群配置和安装
Kafka 在 Linux 下的集群配置和安装 Apache Kafka 是一个流行的分布式流处理平台,广泛用于实时数据管道和流处理应用。本文将详细讲解如何在 Linux 环境中配置和安装 Kafka 集群,并包括通过 Docker 安装和配置 Kafka 的步骤。每个步骤都将提供详细的解释…...

Python--操作列表
1.for循环 1.1 for循环的基本语法 for variable in iterable: # 执行循环体 # 这里可以是任何有效的Python代码块这里的variable是一个变量名,用于在每次循环迭代时临时存储iterable中的下一个元素。 iterable是一个可迭代对象,比如列表(…...

JMeter(需要补充请在留言区发给我,谢谢)
一、学习工具 1、CinfigElement(HTTP Request Defaults、HTTP Header Manager、HTTP Authorization、CSV Data Set Config、User Defined Variables、JDBC Connection Configuration、HTTP Cookie Manager、Random Variable) 二、协议 1、HTTP协议(消息体数据&am…...

线程池的执行流程和配置参数总结
一、线程池的执行流程总结 提交线程任务;如果线程池中存在空闲线程,则分配一个空闲线程给任务,执行线程任务;线程池中不存在空闲线程,则线程池会判断当前线程数是否超过核心线程数(corePoolSize)…...

node-red-L3-重启指定端口的 node-red
重启指定端口 目的步骤查找正在运行的Node.js服务的进程ID(PID):停止Node.js服务:启动Node.js服务: 目的 重启指定端口的 node-red 步骤 在Linux系统中,如果你想要重启一个正在运行的Node.js服务&#x…...

(done) 使用泰勒展开证明欧拉公式
问问神奇的 GPT,how to prove euler formula? 一个答案如下:...

红队apt--邮件钓鱼
前言 欢迎来到我的博客 个人主页:北岭敲键盘的荒漠猫-CSDN博客 免责声明: 本文仅供了解攻击方手法使用,切勿用于非授权情节 初步了解邮件基础 用途方面 这个我们应该比较熟悉,最常用于验证码接收,也有一些厂商会用这个来打广告,…...

十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)
十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式) 文章目录 十七,Spring Boot 整合 MyBatis 的详细步骤(两种方式)1. Spring Boot 配置 MyBatis 的详细步骤2. 最后: MyBatis 的官方文档:https://mybatis.p2hp.com/ 关于 MyBa…...

DNS协议解析
DNS协议解析 什么是DNS协议 IP地址:一长串唯一标识网络上的计算机的数字 域名:一串由点分割的字符串名字 网址包含了域名 DNS:域名解析协议 IP>域名 --反向解析 域名>IP --正向解析 域名 由ICANN管理,有级别…...

每日一题——第一百零八题
题目: 写几个函数, ①输入10个职工的姓名和职工号 ②按照职工号由小到大排列, 姓名顺序也随之调整 ③要求输入一个职工号, 用折半查找找出该职工的姓名 #include<stdio.h> #include<string.h> #define MAX_EMPOLYEES…...

使用Python免费将pdf转为docx
刚刚想将pdf转换为docx文档时,居然要收费 还好我学过编程,这不得露两手 将pdf 转换为 docx 文档 的操作步骤 我这里使用的是Python语言 (1)在终端上安装 pdf2docx 是一个 Python 库,它可以将 PDF 文件转换为 Word (…...

树莓派4B+UBUNTU20.04+静态ip+ssh配置
树莓派4B+UBUNTU20.04+静态ip+ssh配置 1.烧录Ubuntu镜像1.1选择pi 4b1.2选择ubuntu server (服务器版,无桌面)20.041.3选择sd卡1.4 点击右下角 NEXT ,编辑设置,输入密码,wifi选CN, 开启ssh1.5 烧录,依次点击“是”,等待完成2 烧录完成后装入树莓派,上电,等待系统完成配…...

C#实现指南:将文件夹与exe合并为一个exe
在软件开发过程中,有时需要将多个文件(如资源文件、配置文件等)与可执行文件(exe)打包在一起,以便于分发和部署。在C#中,我们可以利用ILMerge或Costura.Fody等工具来实现这一目标。本文将介绍如…...

linux信号 | 学习信号三步走 | 全解析信号的产生方式
前言:本节内容是信号, 主要讲解的是信号的产生。信号的产生是我们学习信号的第二个阶段。 我们已经学习过第一个阶段——信号的概念与预备知识(没有学过的友友可以查看我的前一篇文章)。 以及我们还没有学习信号的第三个阶段——信…...

C++ 刷题 使用到的一些有用的容器和函数
优先队列 c优先队列priority_queue(自定义比较函数)_c优先队列自定义比较-CSDN博客 373. 查找和最小的 K 对数字 - 力扣(LeetCode) 官方题解: class Solution { public:vector<vector<int>> kSmallestP…...

【Kubernetes】常见面试题汇总(三十四)
目录 86. K8s 每个 Pod 中有一个特殊的 Pause 容器能否去除,简述原因。 特别说明: 题目 1-68 属于【Kubernetes】的常规概念题,即 “ 汇总(一)~(二十二)” 。 题目 69-113 属于【Kuberne…...

C++标准库双向链表 list 中的insert函数实现。
CPrimer中文版(第五版): //运行时错误:迭代器表示要拷贝的范围,不能指向与目的位置相同的容器 slist.insert(slist.begin(),slist.begin(),slist.end()); 如果我们传递给insert一对迭代器,它们不能…...

华为机考练习(golang)
输入 第一行输入一个正整数N,表示整数个数。(0<N<100000) 第二行输入N个整数,整数的取值范围为[-100,100]。 第三行输入一个正整数M,M代表窗口的大小,M<100000,且M<N。 输出 窗口…...

51单片机快速入门之按键应用拓展
51单片机快速入门之按键应用拓展 LED的点动控制: 循环检测,当key 为0 时 led 亮 反之为熄灭 while(1){ if(key!1) { led0; }else { led1; } } LED的锁定控制: 当按钮按下,led取反值 while(1) { if(key!1) { led!led; } } LED的4路抢答控制: bz默认为0 !bz 取反值,循环启动…...

数据库 - MySQL的事务
目录 前言 一、事务的特性 (一)原子性 (二)一致性 (三)隔离性 (四)持久性 二、事务的控制语句 三、事务隔离级别 (一)读未提交 (二&…...

【Python机器学习】NLP信息提取——提取人物/事物关系
目录 词性标注 实体名称标准化 实体关系标准化和提取 单词模式 文本分割 断句 断句的方式 使用正则表达式进行断句 词性标注 词性(POS)标注可以使用语言模型来完成,这个语言模型包含词及其所有可能词性组成的字典。然后,该…...