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
请参考以下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订阅的callback默认在非UI线程执行,直接在其中进行UI更新会导致异常。解决方案是使用TaskDispatcher将UI更新操作切换到UI线程。示例代码如下:
emitter.on("eventName", (eventData) => {
    getContext().getUITaskDispatcher().asyncDispatch(() => {
        // 在这里进行UI更新操作
    });
});
确保在callback中通过asyncDispatch或syncDispatch将UI操作切换到UI线程执行,以避免线程冲突。
 
        
       
                   
                   
                  


