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 (…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
在鸿蒙HarmonyOS 5中实现抖音风格的点赞功能
下面我将详细介绍如何使用HarmonyOS SDK在HarmonyOS 5中实现类似抖音的点赞功能,包括动画效果、数据同步和交互优化。 1. 基础点赞功能实现 1.1 创建数据模型 // VideoModel.ets export class VideoModel {id: string "";title: string ""…...
CMake 从 GitHub 下载第三方库并使用
有时我们希望直接使用 GitHub 上的开源库,而不想手动下载、编译和安装。 可以利用 CMake 提供的 FetchContent 模块来实现自动下载、构建和链接第三方库。 FetchContent 命令官方文档✅ 示例代码 我们将以 fmt 这个流行的格式化库为例,演示如何: 使用 FetchContent 从 GitH…...
全面解析各类VPN技术:GRE、IPsec、L2TP、SSL与MPLS VPN对比
目录 引言 VPN技术概述 GRE VPN 3.1 GRE封装结构 3.2 GRE的应用场景 GRE over IPsec 4.1 GRE over IPsec封装结构 4.2 为什么使用GRE over IPsec? IPsec VPN 5.1 IPsec传输模式(Transport Mode) 5.2 IPsec隧道模式(Tunne…...
springboot整合VUE之在线教育管理系统简介
可以学习到的技能 学会常用技术栈的使用 独立开发项目 学会前端的开发流程 学会后端的开发流程 学会数据库的设计 学会前后端接口调用方式 学会多模块之间的关联 学会数据的处理 适用人群 在校学生,小白用户,想学习知识的 有点基础,想要通过项…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换
目录 关键点 技术实现1 技术实现2 摘要: 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式(自动驾驶、人工驾驶、远程驾驶、主动安全),并通过实时消息推送更新车…...
群晖NAS如何在虚拟机创建飞牛NAS
套件中心下载安装Virtual Machine Manager 创建虚拟机 配置虚拟机 飞牛官网下载 https://iso.liveupdate.fnnas.com/x86_64/trim/fnos-0.9.2-863.iso 群晖NAS如何在虚拟机创建飞牛NAS - 个人信息分享...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...
适应性Java用于现代 API:REST、GraphQL 和事件驱动
在快速发展的软件开发领域,REST、GraphQL 和事件驱动架构等新的 API 标准对于构建可扩展、高效的系统至关重要。Java 在现代 API 方面以其在企业应用中的稳定性而闻名,不断适应这些现代范式的需求。随着不断发展的生态系统,Java 在现代 API 方…...
