From 65533c2d090f4d68bc71de8fa07b4ce69108cba8 Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Tue, 23 Dec 2025 09:53:02 +0800 Subject: [PATCH] =?utf8?q?=E4=BF=AE=E5=A4=8D=E9=80=80=E5=87=BA=E5=AF=B9?= =?utf8?q?=E8=AF=9D=E5=88=87=E6=8D=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../thunderbird/include/ThunderBirdMainView.h | 4 ++ .../thunderbird/src/ThunderBirdMainView.cpp | 32 ++++++++++++ .../thunderbird/src/ThunderBirdModel.cpp | 51 +++++++++++++++---- 3 files changed, 77 insertions(+), 10 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdMainView.h b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdMainView.h index 69d98619d..8dd6f009c 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdMainView.h +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdMainView.h @@ -82,6 +82,10 @@ namespace OHOS void InitCommonPageComponents(); void HideCommonPageComponents(); bool SwitchVideo(const char *uri); + // 检查是否正在切换视频 + static bool IsSwitchingVideo(); + // 等待视频切换完成(最多等待指定时间) + static bool WaitForVideoSwitchComplete(int maxWaitMs = 2000); // 切换头发贴图 void SwitchHair(const char *hairPath); // 切换头发图标 diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp index 23f921adc..a239a2cf1 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp @@ -430,6 +430,28 @@ namespace OHOS } + bool ThunderBirdMainView::IsSwitchingVideo() + { + return g_isSwitchingVideo; + } + + bool ThunderBirdMainView::WaitForVideoSwitchComplete(int maxWaitMs) + { + int waitCount = 0; + int maxWaitCount = maxWaitMs / 20; // 每20ms检查一次 + while (g_isSwitchingVideo && waitCount < maxWaitCount) + { + usleep(20000); // 等待20ms + waitCount++; + } + if (g_isSwitchingVideo) + { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::WaitForVideoSwitchComplete: Timeout after %d ms, video switch still in progress", maxWaitMs); + return false; + } + return true; + } + bool ThunderBirdMainView::SwitchVideo(const char *uri) // 切换表情接口 { WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Switching to video: %s", uri ? uri : "null"); @@ -449,6 +471,16 @@ namespace OHOS return true; // 返回true表示"成功",因为不需要切换 } + // 如果正在切换视频,等待完成(最多等待2秒) + if (g_isSwitchingVideo) + { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Video switch in progress, waiting for completion..."); + if (!WaitForVideoSwitchComplete(2000)) + { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdMainView::SwitchVideo: Previous video switch did not complete in time, proceeding anyway"); + } + } + // 设置切换视频标志,防止屏幕状态通知暂停播放 g_isSwitchingVideo = true; diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp index 153e3d033..a2e3dc5f0 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp @@ -2635,16 +2635,47 @@ extern "C" { WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: switching to video: %s", normalizedPath.c_str()); - // 通过图形服务调用 ThunderBirdMainView 的 SwitchVideo 函数 - // 注意:PostGraphicEvent 是异步的,这里直接返回 true 表示调用已提交 - GraphicService::GetInstance()->PostGraphicEvent( - [normalizedPath]() { - if (ThunderBirdMainView::GetInstance()) { - ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str()); - } else { - WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: ThunderBirdMainView instance is null"); - } - }); + // 检查 ThunderBirdMainView 是否已初始化 + // 如果未初始化,直接返回,避免在启动时出现问题 + if (ThunderBirdMainView::GetInstance() == nullptr) + { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: ThunderBirdMainView not initialized yet, skipping switch"); + return false; + } + + // 如果正在切换视频,等待完成(最多等待2秒) + // 这样可以避免快速进入/退出对话模式时导致的表情切换冲突 + if (ThunderBirdMainView::IsSwitchingVideo()) + { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: Video switch in progress, waiting for completion..."); + // 在图形线程中等待,避免阻塞当前线程 + GraphicService::GetInstance()->PostGraphicEvent( + [normalizedPath]() { + // 等待之前的切换完成 + if (ThunderBirdMainView::GetInstance()) { + ThunderBirdMainView::WaitForVideoSwitchComplete(2000); + // 再次检查是否还在切换(防止超时后仍在切换) + if (!ThunderBirdMainView::IsSwitchingVideo()) { + ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str()); + } else { + WEARABLE_LOGW(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: Video switch still in progress after wait, skipping this switch"); + } + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: ThunderBirdMainView instance is null"); + } + }); + } else { + // 通过图形服务调用 ThunderBirdMainView 的 SwitchVideo 函数 + // 注意:PostGraphicEvent 是异步的,这里直接返回 true 表示调用已提交 + GraphicService::GetInstance()->PostGraphicEvent( + [normalizedPath]() { + if (ThunderBirdMainView::GetInstance()) { + ThunderBirdMainView::GetInstance()->SwitchVideo(normalizedPath.c_str()); + } else { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::SwitchExpressionVideo: ThunderBirdMainView instance is null"); + } + }); + } return true; // 异步调用,返回 true 表示调用已提交 } -- 2.17.1