【无标题】

创建一个网络请求 httpRequest = http.createHttp() 
设定传入的参数 url、method: http.RequestMethod、data,
拼接地址,
处理get请求拼接参数
设置请求对象 config(method、readTimeout、extraData、header)
发请求 httpRequest.request(urlStr, config)
拿到响应结果res.responseCode判断401请求超时,删除token重定向到登录页
404找不到地址抛出异常
res.result.code200的话,返回请求结果,否则的话抛出异常
用try catch包裹一下,catch里面抛出异常,finally里面销毁请求httpRequest.destroy()

无感刷新token,如果401的话,判断本地是否存有refresh_token,没有的话删除本地和首选项的token和refresh_token并跳登录,有的话把他放到请求头中,调刷新token接口,用refresh_token换token,存到本地和首选项,将之前失败的请求重新发出去,try catch包裹一下换token请求,失败的话,删除本地和首选项的token和refresh_token并跳登录

1. 你在项目中用过线程通信吗,线程是怎么进行通信的?
1. 同一线程内通信
getContext(this).eventHub.emit('search_list', json)  // 发送,事件名,数据
getContext(this).eventHub.on('search_list',(json: string) => { // 接收
  this.list = JSON.parse(json) as AddressItem[]
})
2. 线程间通信
emitter.emit({eventId: '123'},{data: {
	obj: {}
}})
emitter.on({eventId: '123'}, (data)=>{
data.data.obj
})
3. 进程间通信
commentEventManager

进程
同一bundle包名下的程序,在同一进程下,webview是一个单一的进程
线程
TaskPool
taskpool.execute(getTask) // 开启一个线程
@Concurrent getTask(){}
worker
新建一个worker文件,let w = new worker.ThreadWorker('worker文件路径')
w.postMessage('给worker发一条消息')
w.onmessage = (e: MessageEvents) => { 接收消息
	...
	w.terminate()// 自毁进程
}
2. 页面的生命周期有哪些?UiAbility的生命周期呢?

页面生命周期
aboutToAppear -> onPageShow -> onPageHide -> aboutToDisappear - onBackPress
组件生命周期:aboutToAppear、aboutToDisappear

UIAbility的生命周期包括Create、Foreground、Background、Destroy四个状态
onCreate - onWindowStageCreate - onForeground - onBackground - onWindowStageDestroy - onDestroy-onNewWant

3. 你在项目中使用首选项主要用来做什么

存放token,存放广告数据

// 1. 获取首选项实例
const adStore = preferences.getPreferences(this.context, USER_SETTING)
// 2. 设置值
adStore.put(USER_SETTING_AD, '数据')
adStore.flush()  // 写入磁盘
// 3. 读取值
tokenStore.get(USER_SETTING_AD, "默认值")
持久化的数据
PersistentStorage.PersistProp<string>(TOKEN_KEY, "")

AppStorage.SetOrCreate<number>(TOKEN_KEY, token )
AppStorage.Get<string>(TOKEN_KEY)

4. 组件通信的方式有哪些

@Prop单向数据流(父变子变,子变父不变)
@Link双向绑定 注意:Link修饰的数据必须得是最外层的 State数据,不能传变化后的,比如forEach里的参数item就不允许传
@Provide和 @Consume 状态共享-后代组件
@Observed与@ObjectLink,可以解决@Link弊端,如上面提到的forEach里的参数item就不允许传到@link,此时就可以传item了

5. 弹窗UI是怎么在页面UI中使用的
// HmLoading
@CustomDialog
controller: CustomDialogController

layer: CustomDialogController = new CustomDialogController({
  autoCancel: false,
  customStyle: true,
  alignment: DialogAlignment.Center,
  builder: HmLoading()
})
this.layer.open()
this.layer.close()

bindSheet(isShow, builder())
鸿蒙的刷新机制是怎么样的,多层嵌套时,是从build开始刷新吗?
回答: 
  一个组件的渲染- aboutToAppear - build函数(构建UI视图)
当响应式数据发生变化 =》 builde的重新执行
所有的鸿蒙的响应式监测都只能监测到一层
多层嵌套时-执行的顺序 。洋葱圈模式- 一定时先最里面的组件渲染完毕,
一定是最外层的组件最后渲染。

关于更新机制的问题
	循环比较-比较你的key存在不,0_"name: '张三'"如果存在相同的key,则不更新。
    比较机制- 列表比较-ForEach-有三个参数, 第三个参数需要返回一个唯一的key, 如果不写,系统会自动帮我们生成一个函数 规则 index_JSON.stringfy(item) { a: 1, b: 2 } => { a: 2: b: 2 }
 如果列表中key发生变化,更新机制直接销毁该组件,然后重新创建, 但是反之,你给的key如果没有发生变化,但是数据变化了,就会出现页面不更新现象。
6. 常用的修饰符有哪些介绍一下
7. buffer是什么与16进制和数组有什么关系吗
8. build和buildparams的区别
9. 对于一些公共的样式你是怎么做的?有没有什么优化的方式
10. 说说ability生命周期
11. 鸿蒙和安卓和IOS的区别
12. 你是什么时候开始学习鸿蒙的?
13. 你现在用的是鸿蒙几的api和编辑器?
14. 你项目用到了鸿蒙那些功能?
15. 你项目中遇到了那些难点,如何解决的?
16. 如果方便的话,简单介绍并演示一下你做的项目?
17. 说说鸿蒙开发中的通信
18. 你说你开发过项目,那么,开发鸿蒙项目流程是怎么样的?简单介绍一下
19. 共享库之间怎么进行页面跳转
20. 鸿蒙的刷新机制是怎么样的,多层嵌套时,是从build开始刷新吗
21.用过数据库没?详细说说
关系型数据库是基于SQLite组件提供的本地数据库,用于管理应用中的结构化数据。
数据库文件会在我们应用沙箱里,数据库框架给我们提供了一些api来操作数据库
初始化数据库
1.导入关系型数据库模块
import relationalStore from '@ohos.data.relationalStore'
2.初始化数据库表
	2.1 rdb配置
	const config = {
		name: 'MyApplication.db', // 数据库文件名
		securityLevel: relationalStore.securityLevel.S1 // 数据库安全级别
	}
	2.2 初始化表的SQL
	const sql = `CREATE TABLE IF NOT EXISTS TASK (
						  ID INTEGER PRIMARY KEY,
						  NAME TEXT NOT NULL,
						  FINISHED BIT
						)`
	2.3 获取rdb
	relationalStore.getRdbStore(this.context, conifg, (err, rdbStore) => {
		rdbStore.executeSql(sql)
	})
增删改数据
1. 新增数据
	1.1 准备数据
	let task = {id: 1, name: '任务1', finished: false}
	1.2 新增
	this.rdbStore.insert(this.tableName, task)
2. 修改
	2.1 要更新的数据
	let task = {'finished': true}
	2.2 查询条件,RdbPredicates就是条件谓词
	let predicates = new relationalStore.RdbPredicates(this.tableName)
	predicates .equalTo('ID', id)
	2.3 执行更新
	this.rdbStore.update(task, predicates)
3. 删除
	3.1 查询条件
	let predicates = new relationalStore.RdbPredicates(this.tableName)
	predicates.equalTo('ID', id)
	3.2 执行删除
	this.rdbStore.delete(predicates)
查询
1.查询数据
	1.1 查询条件
	let predicates = new relationalStore.RdbPredicates(this.tableName)
	1.2 执行查询
	let result = await this.rdbStore.query(predicates, ['ID', 'NAME', 'FINISHED'])
2.解析结果
	2.1 准备数组保存结果
	let tasks: any[] = []
	2.2 循环遍历结果集,判断是否是遍历到了最后一行
	while(!result.isAtLastRow){
		指针移动到下一行数据
		result.goToNextRow()
		根据字段名获取字段index,从而获取字段值
		let id = result.getLong(result.getColumeIndex('ID'));
		let name = result.getLong(result.getColumeIndex('NAME'));
		tasks.push({id, name})
	}

111
在这里插入图片描述

发布的应用用什么监控的日志呢
websocker用过吗?说说你在项目中怎么用的
项目中有用到多线程嘛,具体说一下多线程的作用,如何使用的
什么是鸿蒙应用签名?
typescript javascript, 和arts的关系,
线程池的作用,线程和线程池的关系
harnonyos 和 openharnoy有什么关系,又有哪些区别的
有没有开发过卡片,介绍一下,元服务了解吗?具体介绍一下
进程间通信

我看你在这个音乐项目中用到了断点续传,它是如何实现的呢

回答:
断点续传本质的上的逻辑和前端的断点续传无疑,如果需要详细了解,可以参考这个文档
https://www.yuque.com/shuiruohanyu/agc9d0/gf2qa2#WXnM9
本质上-就是将一个大的文件分片拆分成若干片段,然后按照顺序一片一片的传递,也就是使用File的slice方法切割成Blob对象,当遇到网络堵塞或者异常的时候,此时服务器可以保存对应的已上传分片的数量和标记,再次请求时,可以通过唯一的md5的标识符判断是否已经传过分片,传过几片,得到第几片的标记,然后再从这个标记直接开始传即可。 大家可以参考上述链接中的详细实现

多线程woker与emite的区别是什么?是否能自动更新UI?worker最大的数量是多少?
自选列表刷新逻辑,如何排序?
UiAbility页面启动的方式有哪些?

如何引入本地的web页面?

鸿蒙原生和h5通信有大概两种方式

  1. 通过消息机制推送,类似于前端的postMessage的跨域通信,首先通过原生端的webviewController进行创建通信端口, createMessagePorts, 该方法会创建两个端口,一个用作原生端,一个用作h5端,然后通过webviewController将其中一个端口通过postMessage发送到h5端,h5端用onmessage来接收该端口,并全局缓存,此时,h5端用接收的端口发送消息给原生端,原声端用自己剩余的端口进行onMessage接听消息,此时就可以实现双向通信
  2. api调用的形式
    原生端可以通过javascriptProxy给h5页面注入可用的sdk应用方法集合,在h5完成初始化后,可以直接调用原生的方法,这是h5调用原生
    原生端也可以直接调用h5端的方法 runJavascript,在这个方法里面传入方法调用传参数就可以
    需要注意的点: 如果原生端的sdk方法是个异步方法,在h5端无法及时得到结果,此时需要再用原生反调h5进行传递结果
不使用CustomDialog和条件渲染怎么实现一个像prompt.showToast的弹窗效果

用动画实现

@Provide和@Consume的使用中,消费者修改了值,提供者那边会变化吗?
输入框获取焦点,弹出键盘会将页面推至屏幕外,想正常显示,应该怎么处理?
蓝牙的连接过程
socket通信过程中,如何保证数据的完整性
页面转场是怎么实现的
鸿蒙是如何保证传输数据的安全性?熟悉哪些常用的加密方式;了解国密加密算法嘛?说说鸿蒙客户端证书加密的流程和使用?
鸿蒙客户端怎么实现长登陆的;再说说token的失效后是如何处理的?
详细讲讲混合开发,网页如何调用系统能力。
A页面->B页面->C页面 C页面改变了A和B页面的值 那两个页面会不会同步改变,(b页面back了c页面再back是回到哪去)
多线程使用首选项需要注意什么
Ability传递参数时 参数带不带类型

// A页面
const context = getContext(this) as common.UIAbilityContext
let want: Want = {
   bundleName: 'com.example.helloworld', // 包名 AppScope/app.json5 app.bundleName
   abilityName: 'HeimaPayAbility', // HeimaPay/src/main/module.json5
   moduleName: 'HeimaPay',
   parameters: {
     order_id: Date.now()
   }
}
const result = await context.startAbilityForResult(want) //拉起ability 接收HeimaPay的返回值
const params = result.want.parameters as ResultParams
// ability文件
type AbilityParams = Record<string, number> // 给want.parameters定义一个类型
onCreate(want: Want, launchParam) {
  const params = want.parameters as AbilityParams
  // 将参数设置到AppStorage
  AppStorage.SetOrCreate<number>("order_id",  params.order_id )
}
// B页面
// 销毁当前的ability 将支付结果告诉调用我的人
const context = getContext(this) as common.UIAbilityContext
context.terminateSelfWithResult({
  resultCode: 1,
  want: {
    abilityName: 'EntryAbility',
    bundleName: 'com.example.helloworld',
    moduleName: 'entry',
    parameters: {
      paySuccess: true
    }
  }
})

http请求是同步还是异步多线程下怎么办

除了har包和HSP包 还能打成什么包?有什么区别

1)作用用于实现代码和资源的共享。同一个Library类型的Module可以被其他的Module多次引用,合理地使用该类型的Module,能够降低开发和维护成本。Library类型的Module分为Static和Shared两种类型,编译后会生成共享包。
● Static Library:静态共享库。编译后会生成一个以.har为后缀的文件,即静态共享包HAR(Harmony Archive)。
● Shared Library:动态共享库。编译后会生成一个以.hsp为后缀的文件,即动态共享包HSP(Harmony Shared Package)。
2)HAR与HSP两种共享包的主要区别体现在:
在这里插入图片描述
3)使用场景:
har包适用用于不同项目下代码和资源共享,可以上传至openharmnony第三方共享仓开源,也可以在公司内搭建私有仓库进内共享。hsp适用于单个项目内容三层架构按功能模块分包,有利于降低打包体积,目前hsp还不能项目间共享。

你用过哪些修饰符?
为什么用@link能实现的 不全部直接使用@StorageLink替代
@Link和@Prop的区别
用过第三方http请求库吗 怎么实现加密?
用户频繁切换搜索条件会出现数据混乱问题,怎么解决?
在鸿蒙怎么调用C++的接口?
API9和PI11有什么改变?
鸿蒙实现多线程的两种方式有什么区别?
http是在主线程内还是另起一个线程?
Promise 异步、和TaskPool有什么区别吗
多线程改变了主线程的值 那么主线程内的值会不会一起改变?
http是在主线程内还是另起一个线程?那么异步和TaskPool有什么区别吗
http请求怎么使用TaskPool实现?
TaskPool线程的 数据怎么和主线程 同步? 线程间怎么同步数据

路由传值

路由模式
● Standard:标准实例模式,也是默认情况下的实例模式。每次调用该方法都会新建一个目标页,并压入栈顶。
● Single:单实例模式。即如果目标页的url在页面栈中已经存在同url页面,则离栈顶最近的同url页面会被移动到栈顶,并重新加载;如果目标页的url在页面栈中不存在同url页面,则按照标准模式跳转。
简单理解
1. Standard-只要你push,页面栈里面就会加一项,不管之前加没加过
2. Single- 你之前加过,不会加新的页面,会把你之前加过的页面加出来
router.pushUrl({
  url: 'pages/CarRecord/CarRecord',
  params: {
    id: this.taskDetailData.id
  }
})
// 接收
const params = router.getParams() as CommonRouterParams
if (params && params.id) {
  
}
// 类型
export class CommonRouterParams {
  id?: string = ''
}
  • 23
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值