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线程执行,以避免线程冲突。