diff --git a/adapter/preview/entrance/ace_container.cpp b/adapter/preview/entrance/ace_container.cpp index 935ddf5b0e99a5e96f6c7209b5ce94d0da25fc71..7ef6da944467fe725b1769659701254ca9c7367e 100644 --- a/adapter/preview/entrance/ace_container.cpp +++ b/adapter/preview/entrance/ace_container.cpp @@ -213,6 +213,9 @@ void AceContainer::InitializeFrontend() void AceContainer::RunNativeEngineLoop() { taskExecutor_->PostTask([frontend = frontend_]() { frontend->RunNativeEngineLoop(); }, TaskExecutor::TaskType::JS); + // After the JS thread executes frontend ->RunNativeEngineLoop(), + // it is thrown back into the Platform thread queue to form a loop. + taskExecutor_->PostTask([this]() { RunNativeEngineLoop(); }, TaskExecutor::TaskType::PLATFORM); } void AceContainer::InitializeAppConfig(const std::string& assetPath, const std::string& bundleName, diff --git a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h index 5a9ebdd341fe9f3e7a762d31aea1d6a1a844b43a..d54f1277438cce0935d6130264dc310612b04939 100644 --- a/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h +++ b/frameworks/bridge/declarative_frontend/engine/jsi/jsi_declarative_engine.h @@ -363,7 +363,9 @@ public: void RunNativeEngineLoop() override { - if (nativeEngine_ != nullptr) { + static bool hasPendingExpection = false; + if (nativeEngine_ && !hasPendingExpection) { + hasPendingExpection = nativeEngine_->HasPendingException(); nativeEngine_->Loop(LOOP_NOWAIT, false); } } diff --git a/frameworks/bridge/js_frontend/engine/common/js_engine.cpp b/frameworks/bridge/js_frontend/engine/common/js_engine.cpp index 49c697c6d32f2aa82c33d020bf1df3673098bf3b..5487db3f8672960c6a513f1cbe8045c75ed37d5a 100644 --- a/frameworks/bridge/js_frontend/engine/common/js_engine.cpp +++ b/frameworks/bridge/js_frontend/engine/common/js_engine.cpp @@ -27,7 +27,9 @@ namespace OHOS::Ace::Framework { void JsEngine::RunNativeEngineLoop() { - if (nativeEngine_ != nullptr) { + static bool hasPendingExpection = false; + if (nativeEngine_ && !hasPendingExpection) { + hasPendingExpection = nativeEngine_->HasPendingException(); nativeEngine_->Loop(LOOP_NOWAIT, false); } } @@ -68,4 +70,4 @@ PixelMapNapiEntry JsEngine::GetPixelMapNapiEntry() } #endif -} // namespace OHOS::Ace::Framework \ No newline at end of file +} // namespace OHOS::Ace::Framework