diff --git a/adapter/ohos/entrance/ace_container.cpp b/adapter/ohos/entrance/ace_container.cpp index 8a29a95f0f6599b7f96c9f783e7fd4ede27bdcc4..01d1b4848dd7f15603a163e41c6231baf1eee90f 100644 --- a/adapter/ohos/entrance/ace_container.cpp +++ b/adapter/ohos/entrance/ace_container.cpp @@ -305,39 +305,38 @@ void AceContainer::OnShow(int32_t instanceId) if (!container->UpdateState(Frontend::State::ON_SHOW)) { return; } + auto front = container->GetFrontend(); + if (front && !container->IsSubContainer()) { + WeakPtr weakFrontend = front; + taskExecutor->PostTask( + [weakFrontend]() { + auto frontend = weakFrontend.Upgrade(); + if (frontend) { + frontend->UpdateState(Frontend::State::ON_SHOW); + frontend->OnShow(); + } + }, + TaskExecutor::TaskType::JS); + } - auto jsTask = [container, front = container->GetFrontend()]() { - if (front && !container->IsSubContainer()) { - front->UpdateState(Frontend::State::ON_SHOW); - front->OnShow(); - } - }; - - auto uiTask = [container]() { - std::unordered_map> cardFrontendMap; - container->GetCardFrontendMap(cardFrontendMap); - for (const auto& [_, weakCardFront] : cardFrontendMap) { - auto cardFront = weakCardFront.Upgrade(); - if (!cardFront) { - LOGE("cardFront is null"); - continue; + taskExecutor->PostTask( + [container]() { + std::unordered_map> cardFrontendMap; + container->GetCardFrontendMap(cardFrontendMap); + for (const auto& [_, weakCardFront] : cardFrontendMap) { + auto cardFront = weakCardFront.Upgrade(); + if (!cardFront) { + LOGE("cardFront is null"); + continue; + } + cardFront->OnShow(); } - cardFront->OnShow(); - } - auto pipelineBase = container->GetPipelineContext(); - CHECK_NULL_VOID(pipelineBase); - pipelineBase->OnShow(); - pipelineBase->SetForegroundCalled(true); - }; - - // stege model needn't post task when already run on UI - if (container->GetSettings().useUIAsJSThread && taskExecutor->WillRunOnCurrentThread(TaskExecutor::TaskType::UI)) { - jsTask(); - uiTask(); - } else { - taskExecutor->PostTask(jsTask, TaskExecutor::TaskType::JS); - taskExecutor->PostTask(uiTask, TaskExecutor::TaskType::UI); - } + auto pipelineBase = container->GetPipelineContext(); + CHECK_NULL_VOID(pipelineBase); + pipelineBase->OnShow(); + pipelineBase->SetForegroundCalled(true); + }, + TaskExecutor::TaskType::UI); } void AceContainer::OnHide(int32_t instanceId) @@ -350,47 +349,43 @@ void AceContainer::OnHide(int32_t instanceId) if (!container->UpdateState(Frontend::State::ON_HIDE)) { return; } - std::unordered_map> cardFrontendMap; - container->GetCardFrontendMap(cardFrontendMap); - - auto jsTask = [container, front = container->GetFrontend(), cardFrontendMap]() { - if (front && !container->IsSubContainer()) { - front->UpdateState(Frontend::State::ON_HIDE); - front->OnHide(); - front->TriggerGarbageCollection(); - } - for (const auto& [_, weakCardFront] : cardFrontendMap) { - auto cardFront = weakCardFront.Upgrade(); - if (!cardFront) { - LOGE("cardFront is null"); - continue; - } - cardFront->TriggerGarbageCollection(); - } - }; + auto front = container->GetFrontend(); + if (front && !container->IsSubContainer()) { + WeakPtr weakFrontend = front; + taskExecutor->PostTask( + [weakFrontend]() { + auto frontend = weakFrontend.Upgrade(); + if (frontend) { + frontend->UpdateState(Frontend::State::ON_HIDE); + frontend->OnHide(); + frontend->TriggerGarbageCollection(); + } + }, + TaskExecutor::TaskType::JS); + } - auto uiTask = [container, cardFrontendMap]() { - for (const auto& [_, weakCardFront] : cardFrontendMap) { - auto cardFront = weakCardFront.Upgrade(); - if (!cardFront) { - LOGE("cardFront is null"); - continue; + taskExecutor->PostTask( + [container]() { + auto taskExecutor = container->GetTaskExecutor(); + std::unordered_map> cardFrontendMap; + container->GetCardFrontendMap(cardFrontendMap); + for (const auto& [_, weakCardFront] : cardFrontendMap) { + auto cardFront = weakCardFront.Upgrade(); + if (!cardFront) { + LOGE("cardFront is null"); + continue; + } + cardFront->OnHide(); + if (taskExecutor) { + taskExecutor->PostTask( + [cardFront]() { cardFront->TriggerGarbageCollection(); }, TaskExecutor::TaskType::JS); + } } - cardFront->OnHide(); - } - auto pipelineBase = container->GetPipelineContext(); - CHECK_NULL_VOID(pipelineBase); - pipelineBase->OnHide(); - }; - - // stege model needn't post task when already run on UI - if (container->GetSettings().useUIAsJSThread && taskExecutor->WillRunOnCurrentThread(TaskExecutor::TaskType::UI)) { - jsTask(); - uiTask(); - } else { - taskExecutor->PostTask(jsTask, TaskExecutor::TaskType::JS); - taskExecutor->PostTask(uiTask, TaskExecutor::TaskType::UI); - } + auto pipelineContext = container->GetPipelineContext(); + CHECK_NULL_VOID(pipelineContext); + pipelineContext->OnHide(); + }, + TaskExecutor::TaskType::UI); } void AceContainer::OnActive(int32_t instanceId) diff --git a/frameworks/bridge/declarative_frontend/frontend_delegate_declarative.cpp b/frameworks/bridge/declarative_frontend/frontend_delegate_declarative.cpp index fadc0422fcf84ee8c468ef00fe2b31c0e89fcdbb..5523f7e12b76d5d8252940c0c008c79944d29ad4 100644 --- a/frameworks/bridge/declarative_frontend/frontend_delegate_declarative.cpp +++ b/frameworks/bridge/declarative_frontend/frontend_delegate_declarative.cpp @@ -500,14 +500,30 @@ void FrontendDelegateDeclarative::NotifyAppStorage( void FrontendDelegateDeclarative::OnBackGround() { - OnPageHide(); + taskExecutor_->PostTask( + [weak = AceType::WeakClaim(this)] { + auto delegate = weak.Upgrade(); + if (!delegate) { + return; + } + delegate->OnPageHide(); + }, + TaskExecutor::TaskType::JS); } void FrontendDelegateDeclarative::OnForeground() { // first page show will be called by push page successfully if (!isFirstNotifyShow_) { - OnPageShow(); + taskExecutor_->PostTask( + [weak = AceType::WeakClaim(this)] { + auto delegate = weak.Upgrade(); + if (!delegate) { + return; + } + delegate->OnPageShow(); + }, + TaskExecutor::TaskType::JS); } isFirstNotifyShow_ = false; } @@ -2397,67 +2413,41 @@ void FrontendDelegateDeclarative::RebuildAllPages() void FrontendDelegateDeclarative::OnPageShow() { - auto task = [weak = AceType::WeakClaim(this)] { - auto delegate = weak.Upgrade(); - CHECK_NULL_VOID(delegate); - if (Container::IsCurrentUseNewPipeline()) { - auto pageRouterManager = delegate->GetPageRouterManager(); - CHECK_NULL_VOID(pageRouterManager); - auto pageNode = pageRouterManager->GetCurrentPageNode(); - CHECK_NULL_VOID(pageNode); - auto pagePattern = pageNode->GetPattern(); - CHECK_NULL_VOID(pagePattern); - pagePattern->OnShow(); - return; - } - - auto pageId = delegate->GetRunningPageId(); - auto page = delegate->GetPage(pageId); - if (page) { - page->FireDeclarativeOnPageAppearCallback(); - } - }; - - if (taskExecutor_->WillRunOnCurrentThread(TaskExecutor::TaskType::JS)) { - task(); - FireSyncEvent("_root", std::string("\"viewappear\",null,null"), std::string("")); + if (Container::IsCurrentUseNewPipeline()) { + CHECK_NULL_VOID(pageRouterManager_); + auto pageNode = pageRouterManager_->GetCurrentPageNode(); + CHECK_NULL_VOID(pageNode); + auto pagePattern = pageNode->GetPattern(); + CHECK_NULL_VOID(pagePattern); + pagePattern->OnShow(); return; - } else { - taskExecutor_->PostTask(task, TaskExecutor::TaskType::JS); - FireAsyncEvent("_root", std::string("\"viewappear\",null,null"), std::string("")); } + + auto pageId = GetRunningPageId(); + auto page = GetPage(pageId); + if (page) { + page->FireDeclarativeOnPageAppearCallback(); + } + FireAsyncEvent("_root", std::string("\"viewappear\",null,null"), std::string("")); } void FrontendDelegateDeclarative::OnPageHide() { - auto task = [weak = AceType::WeakClaim(this)] { - auto delegate = weak.Upgrade(); - CHECK_NULL_VOID(delegate); - if (Container::IsCurrentUseNewPipeline()) { - auto pageRouterManager = delegate->GetPageRouterManager(); - CHECK_NULL_VOID(pageRouterManager); - auto pageNode = pageRouterManager->GetCurrentPageNode(); - CHECK_NULL_VOID(pageNode); - auto pagePattern = pageNode->GetPattern(); - CHECK_NULL_VOID(pagePattern); - pagePattern->OnHide(); - return; - } - - auto pageId = delegate->GetRunningPageId(); - auto page = delegate->GetPage(pageId); - if (page) { - page->FireDeclarativeOnPageDisAppearCallback(); - } - }; - - if (taskExecutor_->WillRunOnCurrentThread(TaskExecutor::TaskType::JS)) { - task(); - FireSyncEvent("_root", std::string("\"viewdisappear\",null,null"), std::string("")); - } else { - taskExecutor_->PostTask(task, TaskExecutor::TaskType::JS); - FireAsyncEvent("_root", std::string("\"viewdisappear\",null,null"), std::string("")); + if (Container::IsCurrentUseNewPipeline()) { + CHECK_NULL_VOID(pageRouterManager_); + auto pageNode = pageRouterManager_->GetCurrentPageNode(); + CHECK_NULL_VOID(pageNode); + auto pagePattern = pageNode->GetPattern(); + CHECK_NULL_VOID(pagePattern); + pagePattern->OnHide(); + return; + } + auto pageId = GetRunningPageId(); + auto page = GetPage(pageId); + if (page) { + page->FireDeclarativeOnPageDisAppearCallback(); } + FireAsyncEvent("_root", std::string("\"viewdisappear\",null,null"), std::string("")); } void FrontendDelegateDeclarative::ClearAlertCallback(PageInfo pageInfo) diff --git a/frameworks/core/components_ng/pattern/stage/page_pattern.cpp b/frameworks/core/components_ng/pattern/stage/page_pattern.cpp index 74782bd37a9a91d4c264b232bbb0945936a3052b..945115a7b9e4b1a885d6f33e95389fefedce5376 100644 --- a/frameworks/core/components_ng/pattern/stage/page_pattern.cpp +++ b/frameworks/core/components_ng/pattern/stage/page_pattern.cpp @@ -144,8 +144,10 @@ void PagePattern::OnShow() CHECK_NULL_VOID_NOLOG(isRenderDone_); CHECK_NULL_VOID_NOLOG(!isOnShow_); isOnShow_ = true; + auto context = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(context); if (onPageShow_) { - onPageShow_(); + context->PostAsyncEvent([onPageShow = onPageShow_]() { onPageShow(); }); } } @@ -153,8 +155,10 @@ void PagePattern::OnHide() { CHECK_NULL_VOID_NOLOG(isOnShow_); isOnShow_ = false; + auto context = PipelineContext::GetCurrentContext(); + CHECK_NULL_VOID(context); if (onPageHide_) { - onPageHide_(); + context->PostAsyncEvent([onPageHide = onPageHide_]() { onPageHide(); }); } }