From 395b7b117774ff9ba6def6f2e6ac4bf7ab7b29d0 Mon Sep 17 00:00:00 2001 From: Pieter De Baets Date: Fri, 1 Dec 2023 06:52:48 -0800 Subject: [PATCH] Schedule CatalystInstanceImpl destruction using new thread (#41720) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/41720 We currently go via the UI thread, so we can use AsyncTask to schedule the final bit of async ReactContext destruction. This is a requirement for the AsyncTask API, which is also deprecated. We should figure out a better way to schedule and re-use threads across React Native Android, but until then, we can just create a new Thread here, which is also what we do for instance creation. Changelog: [Internal] Reviewed By: NickGerleman Differential Revision: D51706689 fbshipit-source-id: cf17e20e91b195b956b1701e6d91d563fdba4d15 --- .../react/bridge/CatalystInstanceImpl.java | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java index be3c61b6dc3622..621372533b22e6 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -11,7 +11,6 @@ import static com.facebook.systrace.Systrace.TRACE_TAG_REACT_JAVA_BRIDGE; import android.content.res.AssetManager; -import android.os.AsyncTask; import androidx.annotation.Nullable; import com.facebook.common.logging.FLog; import com.facebook.infer.annotation.Assertions; @@ -374,30 +373,24 @@ public void destroy() { mTurboModuleRegistry.invalidate(); } - getReactQueueConfiguration() - .getUIQueueThread() - .runOnQueue( + // Kill non-UI threads from neutral third party + // potentially expensive, so don't run on UI thread + new Thread( () -> { - // AsyncTask.execute must be executed from the UI Thread - AsyncTask.execute( - () -> { - // Kill non-UI threads from neutral third party - // potentially expensive, so don't run on UI thread - - // contextHolder is used as a lock to guard against - // other users of the JS VM having the VM destroyed - // underneath them, so notify them before we reset - // Native - mJavaScriptContextHolder.clear(); - - mHybridData.resetNative(); - getReactQueueConfiguration().destroy(); - FLog.d( - ReactConstants.TAG, "CatalystInstanceImpl.destroy() end"); - ReactMarker.logMarker( - ReactMarkerConstants.DESTROY_CATALYST_INSTANCE_END); - }); - }); + // contextHolder is used as a lock to guard against + // other users of the JS VM having the VM destroyed + // underneath them, so notify them before we reset + // Native + mJavaScriptContextHolder.clear(); + + mHybridData.resetNative(); + getReactQueueConfiguration().destroy(); + FLog.w(ReactConstants.TAG, "CatalystInstanceImpl.destroy() end"); + ReactMarker.logMarker( + ReactMarkerConstants.DESTROY_CATALYST_INSTANCE_END); + }, + "destroy_react_context") + .start(); }); });