HarmonyOS鸿蒙Next中emitter订阅参数callback无法进行UI刷新

HarmonyOS鸿蒙Next中emitter订阅参数callback无法进行UI刷新 使用emiter进行消息订阅,因为需要精确控制订阅对象,所以创建了一个本地的callback对象,通过emitter.on(“aaa”,this.appointmentUpdate)实现了订阅,但是发现虽然回调执行到了appointmentUpdate方法中,但是该方法中改变了ui绑定的变量,并不会引起ui刷新,但是通过emitter.on(“aaa”,()=>{this.getAppointmentData()})就可以成功刷新ui,这是为什么?如果想通过emitter.off(“eventId”, this.appointmentUpdate)去取消指定的订阅,应该怎么写


更多关于HarmonyOS鸿蒙Next中emitter订阅参数callback无法进行UI刷新的实战教程也可以访问 https://www.itying.com/category-93-b0.html

3 回复

请参考以下demo:

import { emitter } from '@kit.BasicServicesKit';

@Entry
@Component
struct Index {
  @State status: number = 1;
  
  aboutToAppear(): void {
    let videoPlayEvent: emitter.InnerEvent = {
      eventId: 1
    };
    // 收到eventId为1的事件后执行该回调
    let callback = (eventData: emitter.EventData): void => {
      console.log("111111")
      //this.status= this.status+1
      this.getAppointmentData();
    };
    // 订阅eventId为1的事件
    emitter.on(videoPlayEvent, callback);
    console.log("订阅成功")
  }
  private getAppointmentData() {
    this.status = 10;
  }

  build() {
    RelativeContainer() {
      Column() {
        Text(`${this.status}`)
        Button("发送订阅事件")
          .onClick(() => {
            console.log("++++" + this.status)
            let event: emitter.InnerEvent = {
              eventId: 1,
              priority: emitter.EventPriority.LOW
            };
            let eventData: emitter.EventData = {
              data: {
                content: 'c',
                id: 1,
                isEmpty: false
              }
            };
            // 发送eventId为1的事件,事件内容为eventData
            emitter.emit(event, eventData);
          })
      }
    }
    .height('100%')
    .width('100%')
  }
}

如果还有问题,麻烦提供可以复现问题的最小demo。

更多关于HarmonyOS鸿蒙Next中emitter订阅参数callback无法进行UI刷新的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


在HarmonyOS鸿蒙Next中,emitter用于事件订阅和发布。当使用emitter订阅事件时,callback函数用于处理接收到的事件数据。如果在callback中尝试进行UI刷新,可能会遇到UI无法更新的问题。这是因为callback函数默认在非UI线程中执行,而UI操作必须在主线程中进行。

要解决这个问题,可以使用TaskDispatcher将UI刷新操作派发到主线程。TaskDispatcher是鸿蒙系统中用于任务调度的工具,可以通过getUITaskDispatcher方法获取主线程的任务分发器。示例代码如下:

import emitter from '@ohos.events.emitter';
import { TaskDispatcher, taskDispatcher } from '@ohos.taskpool';

// 订阅事件
emitter.on('eventName', (eventData) => {
  // 获取主线程的任务分发器
  const uiTaskDispatcher: TaskDispatcher = taskDispatcher.getUITaskDispatcher();

  // 将UI刷新操作派发到主线程
  uiTaskDispatcher.asyncDispatch(() => {
    // 在这里进行UI刷新操作
    // 例如:更新组件的状态
  });
});

在HarmonyOS鸿蒙Next中,emitter订阅的callback默认在非UI线程执行,直接在其中进行UI更新会导致异常。解决方案是使用TaskDispatcher将UI更新操作切换到UI线程。示例代码如下:

emitter.on("eventName", (eventData) => {
    getContext().getUITaskDispatcher().asyncDispatch(() => {
        // 在这里进行UI更新操作
    });
});

确保在callback中通过asyncDispatchsyncDispatch将UI操作切换到UI线程执行,以避免线程冲突。

回到顶部