HarmonyOS 鸿蒙Next emitter.on()会重复多次收到emitter.emit()仅发送过的一次的事件和数据!

发布于 1周前 作者 caililin 来自 鸿蒙OS

HarmonyOS 鸿蒙Next emitter.on()会重复多次收到emitter.emit()仅发送过的一次的事件和数据!
API Version 13,我在emitter.emit()发送了一次事件和数据后,主线程中使用emitter.on()会重复多次收到相同的事件和数据,有没有谁知道这是怎么回事?

5 回复

补充一下:我在c++层有多个线程通过线程安全函数的方式回调到ets层的方法中输出一些日志数据,在ets层的方法中通过emitter.emit()向主线程抛出日志信息,主线程中在emitter.on()方法中收到日志数据更新ui输出日志,但是发现一条日志信息会重复输出显示多次。

更多关于HarmonyOS 鸿蒙Next emitter.on()会重复多次收到emitter.emit()仅发送过的一次的事件和数据!的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


可能是由于以下原因:

  1. 没有正确取消订阅:如果之前订阅了事件但没有正确取消订阅,可能会导致事件在队列中积压,从而在发送新事件时重复接收。
  2. 事件队列未清空:事件队列中可能还残留着之前未处理完毕的事件,导致新事件发送后仍然会被接收。

为了确保一次发送只会收到一次事件,可以采取以下措施:

  1. 使用emitter.once方法订阅事件:emitter.once方法可以单次订阅事件,并在接收到事件后自动取消订阅。这样可以避免事件在队列中积压。
  2. 手动取消订阅:在适当的时候手动调用emitter.off方法取消订阅事件,确保事件队列中的事件不会被无限期保留。
  3. 清空事件队列:在发送新事件之前,确保事件队列中没有残留的未处理事件。

可以通过以上方法尝试下,如果还不行,可以补充更多信息,这边好帮你定位问题。

你好,Emitter模块现在只有手动取消订阅,在适当的时候手动调用emitter.off方法取消订阅事件。

是的,问题找到了,我在启动按钮里面写了订阅事件,但是没在关闭按钮里面取消订阅,多次启动和关闭后就重复订阅了多次导致收到重复消息。

好的。解决了就好,

图片

针对HarmonyOS(鸿蒙)中emitter.on()会重复多次收到emitter.emit()仅发送过的一次事件和数据的问题,这通常是由于事件监听器被多次绑定导致的。在鸿蒙系统中,如果emitter.on()被多次调用而未相应解绑(例如,在组件的多次渲染或更新过程中),那么同一个事件将会被多个监听器处理,从而造成看似事件被重复触发的错觉。

解决此问题的方法通常涉及确保事件监听器的正确绑定与解绑。检查代码中emitter.on()的调用位置,确保它不会在组件的生命周期内被不必要地重复执行。如果监听器的绑定是在某个渲染或更新函数中进行的,考虑将其移动到只执行一次的初始化代码中,或者在绑定新监听器前使用emitter.off()解除旧的监听器。

此外,检查是否有任何循环引用或递归调用可能导致监听器被重复添加。确保事件发射器(emitter)的管理逻辑清晰,避免不必要的重复绑定。

如果问题依旧没法解决请联系官网客服,官网地址是:https://www.itying.com/category-93-b0.html

回到顶部