HarmonyOS鸿蒙Next中事件订阅接收到的回调data丢失

HarmonyOS鸿蒙Next中事件订阅接收到的回调data丢失 在事件订阅时, emitter.emit(event, eventData); 发送的 eventData 里面的 content 存储了一个自定义的 class 对象, 接收到订阅事件后, eventData 里面的 content 值丢失, 变成了 undefined. 经排查, 如果屏蔽这个自定义的 class 里面的 uint8Array 的一个属性, 就能正常接收. 请问有什么处理方式能正常传递这个属性.

3 回复

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丢失可能由以下原因导致:

  1. 事件发布时未正确传递数据:事件发布时未将数据正确传递给订阅者,导致回调中data为空。
  2. 事件订阅者未正确处理数据:订阅者未正确解析或处理传入的data,导致数据丢失。
  3. 事件类型不匹配:订阅者订阅的事件类型与发布的事件类型不一致,导致回调未触发或data丢失。
  4. 线程问题:事件发布和订阅在不同线程中执行,可能导致data未及时传递或丢失。
  5. 系统限制或BUG:系统本身可能存在限制或BUG,导致data在传递过程中丢失。

解决方法包括:

  • 确保事件发布时正确传递数据。
  • 订阅者正确处理data
  • 确保事件类型一致。
  • 检查线程同步问题。
  • 更新系统或应用至最新版本,修复已知BUG。

如问题持续,建议查看相关文档或日志以进一步排查。

在HarmonyOS鸿蒙Next中,事件订阅接收到的回调数据丢失可能是由于以下原因:

  1. 生命周期管理不当:确保订阅事件的组件或对象在回调执行时仍然存在。如果组件被销毁,回调可能无法正确执行或数据丢失。

  2. 异步处理问题:检查回调是否在异步操作中正确处理数据。确保在回调中正确等待异步操作完成。

  3. 事件发布问题:确认事件发布时数据是否正确传递,发布者可能在发布事件时未携带完整数据。

  4. 回调函数实现:检查回调函数是否正确处理接收到的数据,确保没有遗漏或错误处理。

建议仔细检查上述环节,确保事件订阅和回调逻辑的正确性。

回到顶部