修复退出对话切换 2959/target/1 2961/target/1
authorxue <2144439972@qq.com>
Tue, 23 Dec 2025 01:53:02 +0000 (09:53 +0800)
committerxue <2144439972@qq.com>
Tue, 23 Dec 2025 01:53:02 +0000 (09:53 +0800)
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdMainView.h
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdMainView.cpp
code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/src/ThunderBirdModel.cpp

index 69d9861..8dd6f00 100644 (file)
@@ -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);
         // 切换头发图标
index 23f921a..a239a2c 100644 (file)
@@ -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;
         
index 153e3d0..a2e3dc5 100644 (file)
@@ -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 表示调用已提交
     }