From da02c2e5678b95f2d4f506fbc7783e2f2700aca7 Mon Sep 17 00:00:00 2001 From: xue <2144439972@qq.com> Date: Mon, 1 Dec 2025 11:50:40 +0800 Subject: [PATCH] =?utf8?q?=E4=BC=98=E5=8C=96=E8=A1=A8=E6=83=85=E8=A7=86?= =?utf8?q?=E9=A2=91=E4=B8=8E=E6=97=B6=E9=97=B4=E7=BA=BF=E8=BD=BB=E5=BE=AE?= =?utf8?q?=E5=8D=A1=E9=A1=BF=E7=9A=84bug?= MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit --- .../thunderbird/include/ThunderBirdModel.h | 1 + .../thunderbird/src/ThunderBirdModel.cpp | 68 +++++++++++++++++-- 2 files changed, 62 insertions(+), 7 deletions(-) diff --git a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h index 0bc416f9e..f2cf24a16 100644 --- a/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h +++ b/code/sdk/application/wearable/ln/nativeapp/nativeui/thunderbird/include/ThunderBirdModel.h @@ -31,6 +31,7 @@ namespace OHOS void StartStatusTimer(uint32_t interval = 2 * 1000); // 2秒检查一次状态 void StopStatusTimer(void); void StatusCallback(); + void StatusCallbackUI(); // StatusCallback的UI线程部分 // 业务定时器控制函数(保持原有接口) void StartReminderHideTimer(uint32_t intervalMs = 1000); 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 e97845fcd..0f142212e 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 @@ -49,6 +49,7 @@ #include "ai_media.h" #include "ConfigModelC.h" #include "ConfigModel.h" +#include "cmsis_os2.h" #ifdef __cplusplus extern "C" { #endif @@ -1618,15 +1619,41 @@ extern "C" { m_statusTimer = nullptr; } } + // 网络状态更新后台任务结构体 + struct NetworkStatusUpdateTask { + ThunderBirdModel* model; + }; + + // 网络状态更新后台线程函数 + static void NetworkStatusUpdateThreadFunc(void* arg) + { + NetworkStatusUpdateTask* task = static_cast(arg); + if (task == nullptr || task->model == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "NetworkStatusUpdateThreadFunc: Invalid task"); + if (task) delete task; + return; + } + + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "NetworkStatusUpdateThreadFunc: Starting background network status update"); + + // 在后台线程更新网络状态(耗时操作) + task->model->UpdateNetworkStatus(); + + // 更新完成后,通过PostGraphicEvent回到UI线程继续处理 + GraphicService::GetInstance()->PostGraphicEvent([task]() { + if (task->model != nullptr) { + // 继续执行StatusCallback中需要在UI线程执行的部分 + task->model->StatusCallbackUI(); + } + delete task; + }); + } + /** - * @brief 状态管理回调处理 + * @brief 状态管理回调处理(UI线程部分) */ - void ThunderBirdModel::StatusCallback() + void ThunderBirdModel::StatusCallbackUI() { - // ==================== 网络状态处理 ==================== - // 更新网络状态信息(包括SIM卡、信号强度、网络连接等) - // 先检查Cat1电源状态 - UpdateNetworkStatus(); // if( HasCat1Power() == false) // { // WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "Cat1电源状态异常,跳过网络检查"); @@ -1830,7 +1857,34 @@ extern "C" { ThunderBirdPresenter::GetInstance()->timer_callback_toui_proc(); } - WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StatusCallback: status=%d", static_cast(m_currentStatus)); + WEARABLE_LOGD(WEARABLE_LOG_MODULE_APP, "StatusCallbackUI: status=%d", static_cast(m_currentStatus)); + } + + /** + * @brief 状态管理回调处理(启动后台线程更新网络状态) + */ + void ThunderBirdModel::StatusCallback() + { + // ==================== 网络状态处理 ==================== + // 将网络状态更新移到后台线程,避免阻塞UI线程 + NetworkStatusUpdateTask* task = new NetworkStatusUpdateTask(); + task->model = this; + + // 创建后台线程执行网络状态更新 + osThreadAttr_t attr = {}; + attr.name = "NetStatusUpdate"; + attr.stack_size = 0x2000; // 8KB栈 + attr.priority = osPriorityNormal; + + osThreadId_t threadId = osThreadNew((osThreadFunc_t)NetworkStatusUpdateThreadFunc, task, &attr); + if (threadId == nullptr) { + WEARABLE_LOGE(WEARABLE_LOG_MODULE_APP, "ThunderBirdModel::StatusCallback: Failed to create background thread, falling back to sync"); + // 如果线程创建失败,回退到同步方式(不推荐,但至少能工作) + UpdateNetworkStatus(); + StatusCallbackUI(); + delete task; + } + // 如果线程创建成功,StatusCallbackUI会在后台线程完成后通过PostGraphicEvent调用 } -- 2.17.1