diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index cdc1eb26a36..a75c7d39100 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -550,7 +550,11 @@ public class CatalystInstanceImpl implements CatalystInstance { } @Override - public native RuntimeExecutor getRuntimeExecutor(); + public RuntimeExecutor getRuntimeExecutor() { + return getRuntimeExecutor(false); + } + + public native RuntimeExecutor getRuntimeExecutor(boolean shouldFlush); @Override public void addJSIModules(List jsiModules) { diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp index 2a33fa3d0f8..6027a63f49f 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.cpp @@ -346,10 +346,10 @@ CatalystInstanceImpl::getNativeCallInvokerHolder() { } jni::alias_ref -CatalystInstanceImpl::getRuntimeExecutor() { +CatalystInstanceImpl::getRuntimeExecutor(bool shouldFlush) { if (!runtimeExecutor_) { - runtimeExecutor_ = jni::make_global( - JRuntimeExecutor::newObjectCxxArgs(instance_->getRuntimeExecutor())); + runtimeExecutor_ = jni::make_global(JRuntimeExecutor::newObjectCxxArgs( + instance_->getRuntimeExecutor(shouldFlush))); } return runtimeExecutor_; } diff --git a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h index c40a691232c..fff64a0a79d 100644 --- a/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h +++ b/ReactAndroid/src/main/jni/react/jni/CatalystInstanceImpl.h @@ -93,7 +93,8 @@ class CatalystInstanceImpl : public jni::HybridClass { void jniCallJSCallback(jint callbackId, NativeArray *arguments); jni::alias_ref getJSCallInvokerHolder(); jni::alias_ref getNativeCallInvokerHolder(); - jni::alias_ref getRuntimeExecutor(); + jni::alias_ref getRuntimeExecutor( + bool shouldFlush); void setGlobalVariable(std::string propName, std::string &&jsonValue); jlong getJavaScriptContext(); void handleMemoryPressure(int pressureLevel); diff --git a/ReactCommon/cxxreact/Instance.cpp b/ReactCommon/cxxreact/Instance.cpp index 8e837596f71..13679112bbe 100644 --- a/ReactCommon/cxxreact/Instance.cpp +++ b/ReactCommon/cxxreact/Instance.cpp @@ -246,20 +246,23 @@ std::shared_ptr Instance::getJSCallInvoker() { return std::static_pointer_cast(jsCallInvoker_); } -// TODO: Unify with JS CallInvoker -RuntimeExecutor Instance::getRuntimeExecutor() { +RuntimeExecutor Instance::getRuntimeExecutor(bool shouldFlush) { std::weak_ptr weakNativeToJsBridge = nativeToJsBridge_; auto runtimeExecutor = - [weakNativeToJsBridge]( - std::function &&callback) { + [weakNativeToJsBridge, + shouldFlush](std::function &&callback) { if (auto strongNativeToJsBridge = weakNativeToJsBridge.lock()) { strongNativeToJsBridge->runOnExecutorQueue( - [callback = std::move(callback)](JSExecutor *executor) { + [callback = std::move(callback), + shouldFlush](JSExecutor *executor) { jsi::Runtime *runtime = (jsi::Runtime *)executor->getJavaScriptContext(); try { callback(*runtime); + if (shouldFlush) { + executor->flush(); + } } catch (jsi::JSError &originalError) { handleJSError(*runtime, originalError, true); } diff --git a/ReactCommon/cxxreact/Instance.h b/ReactCommon/cxxreact/Instance.h index 7cd11f9bdf5..dfde400a01d 100644 --- a/ReactCommon/cxxreact/Instance.h +++ b/ReactCommon/cxxreact/Instance.h @@ -134,7 +134,7 @@ class RN_EXPORT Instance { /** * RuntimeExecutor is used by Fabric to access the jsi::Runtime. */ - RuntimeExecutor getRuntimeExecutor(); + RuntimeExecutor getRuntimeExecutor(bool shouldFlush); private: void callNativeModules(folly::dynamic &&calls, bool isEndOfBatch);