HarmonyOS鸿蒙Next中事件订阅接收到的回调data丢失
HarmonyOS鸿蒙Next中事件订阅接收到的回调data丢失
在事件订阅时, emitter.emit(event, eventData); 发送的 eventData 里面的 content 存储了一个自定义的 class 对象, 接收到订阅事件后, eventData 里面的 content 值丢失, 变成了 undefined. 经排查, 如果屏蔽这个自定义的 class 里面的 uint8Array 的一个属性, 就能正常接收. 请问有什么处理方式能正常传递这个属性.
eventData 数据类型支持 字符串、整型和布尔型。
使用Emitter进行线程间通信-进程线程通信-Basic Services Kit(基础服务)-基础功能-系统 - 华为HarmonyOS开发者
Uint8Array不是字符串,而是一种特殊的数据结构,用于表示8位无符号整数的数组。
import emitter from '@ohos.events.emitter';
import { router } from '@kit.ArkUI'
let innerEvent: emitter.InnerEvent = {
eventId: 1
};
globalThis.event = innerEvent
@Entry
@Component
struct Index {
build() {
Row() {
Column() {
Button('跳转到第二个页面').onClick(()=>{
router.pushUrl({ url: 'pages/SecondPage' })
})
}
.width('100%')
}
}
aboutToAppear() {
emitter.on(innerEvent, (eventData: emitter.EventData)=>{
console.info('eventData:' + JSON.stringify(eventData))
//{"data":{"content":{"0":104,"1":101,"2":108,"3":108,"4":111,"5":32,"6":119,"7":111,"8":114,"9":108,"10":100},"id":1,"isEmpty":false}}
});
}
}
SecondPage.ets
//SecondPage.ets
import emitter from '@ohos.events.emitter';
import { util } from '@kit.ArkTS';
class ShareObj{
str: Uint8Array
constructor(str: Uint8Array) {
this.str = str
}
}
@Entry
@Component
struct SecondPage {
build() {
Row() {
Column() {
Button('生成事件').onClick(() => {
let array: Uint8Array = new Uint8Array([104,101,108,108,111,32,119,111,114,108,100])
console.log('array1:'+ this.uint8ArrayToString(array))//hello world
let eventData: emitter.EventData = {
data: {
content: new ShareObj(array),
id: 1,
isEmpty: false
}
}
emitter.emit(globalThis.event, eventData);
})
}
.width('100%')
}
}
//Uint8Array转string
uint8ArrayToString(arr: Uint8Array): string {
let str = ''
if (arr && arr.length > 0) {
try {
let textDecode = util.TextDecoder.create('utf-8')
str = textDecode.decodeWithStream(arr)
} catch (err) {}
}
return str
}
}
更多关于HarmonyOS鸿蒙Next中事件订阅接收到的回调data丢失的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
在HarmonyOS鸿蒙Next中,事件订阅回调的data丢失可能由以下原因导致:
- 事件发布时未正确传递数据:事件发布时未将数据正确传递给订阅者,导致回调中
data为空。 - 事件订阅者未正确处理数据:订阅者未正确解析或处理传入的
data,导致数据丢失。 - 事件类型不匹配:订阅者订阅的事件类型与发布的事件类型不一致,导致回调未触发或
data丢失。 - 线程问题:事件发布和订阅在不同线程中执行,可能导致
data未及时传递或丢失。 - 系统限制或BUG:系统本身可能存在限制或BUG,导致
data在传递过程中丢失。
解决方法包括:
- 确保事件发布时正确传递数据。
- 订阅者正确处理
data。 - 确保事件类型一致。
- 检查线程同步问题。
- 更新系统或应用至最新版本,修复已知BUG。
如问题持续,建议查看相关文档或日志以进一步排查。
在HarmonyOS鸿蒙Next中,事件订阅接收到的回调数据丢失可能是由于以下原因:
-
生命周期管理不当:确保订阅事件的组件或对象在回调执行时仍然存在。如果组件被销毁,回调可能无法正确执行或数据丢失。
-
异步处理问题:检查回调是否在异步操作中正确处理数据。确保在回调中正确等待异步操作完成。
-
事件发布问题:确认事件发布时数据是否正确传递,发布者可能在发布事件时未携带完整数据。
-
回调函数实现:检查回调函数是否正确处理接收到的数据,确保没有遗漏或错误处理。
建议仔细检查上述环节,确保事件订阅和回调逻辑的正确性。

