从最新日志分析发现了以下问题:
listeners=0listeners=2isPlaying=true,但form进程有时显示 isPlaying=false文件: entry/src/main/ets/common/widget/PlayerControlService.ets
// 修改前:CommonEvent和AvSession都通知stateListeners
// 修改后:只通过AvSession统一处理,避免重复通知
private handlePlayerStateChange(eventData: commonEventManager.CommonEventData): void {
// 只更新AvSession监听器的数据,避免重复通知
// AvSession监听器会自动通知所有注册的监听器
this.avSessionListener.updateWidgetData(widgetData);
}
文件: entry/src/main/ets/common/widget/AvSessionWidgetListener.ets
// 添加数据相等性检查,避免无意义的更新
private isDataEqual(data1: WidgetData, data2: WidgetData): boolean {
return data1.playState.isPlaying === data2.playState.isPlaying &&
data1.currentSong.title === data2.currentSong.title &&
// ... 其他关键字段比较
}
文件: entry/src/main/ets/entryformability/EntryFormAbility.ets
// 添加100ms防抖延迟,避免短时间内重复更新
private updateDebounceDelay: number = 100;
private updateAllWidgetsWithData(data: WidgetData): void {
const now = Date.now();
if (now - this.lastUpdateTime < this.updateDebounceDelay) {
return; // 跳过重复更新
}
// ... 执行更新
}
关键日志模式:
Data unchanged, skipping update - 重复数据被过滤update debounced, skipping - 防抖机制生效Widget data updated and broadcasted to X listeners - 监听器数量正常formProvider.updateForm 调用这个版本应该能显著减少重复更新,提高widget的响应性能和数据一致性。