diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index f4e9e6e308e5a2..f9057468f37dc7 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -421,6 +421,7 @@ public void onCatalystInstanceDestroy() { mEventDispatcher.unregisterEventEmitter(FABRIC); mReactApplicationContext.unregisterComponentCallbacks(mViewManagerRegistry); + mViewManagerRegistry.invalidate(); // Remove lifecycle listeners (onHostResume, onHostPause) since the FabricUIManager is going // away. Then stop the mDispatchUIFrameCallback false will cause the choreographer diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java index ed4ec63c05d5b3..f15004e38e91d2 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/UIImplementation.java @@ -792,6 +792,7 @@ public void onHostDestroy() {} public void onCatalystInstanceDestroyed() { mViewOperationsEnabled = false; + mViewManagers.invalidate(); } public void setViewHierarchyUpdateDebugListener( diff --git a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java index 995f6eea70333a..1f3c219250a71f 100644 --- a/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java +++ b/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/ViewManagerRegistry.java @@ -103,12 +103,28 @@ public void onSurfaceStopped(final int surfaceId) { viewManagers = new ArrayList<>(mViewManagers.values()); } Runnable runnable = - new Runnable() { - @Override - public void run() { - for (ViewManager viewManager : viewManagers) { - viewManager.onSurfaceStopped(surfaceId); - } + () -> { + for (ViewManager viewManager : viewManagers) { + viewManager.onSurfaceStopped(surfaceId); + } + }; + if (UiThreadUtil.isOnUiThread()) { + runnable.run(); + } else { + UiThreadUtil.runOnUiThread(runnable); + } + } + + /** Called on instance destroy */ + public void invalidate() { + final List viewManagers; + synchronized (this) { + viewManagers = new ArrayList<>(mViewManagers.values()); + } + Runnable runnable = + () -> { + for (ViewManager viewManager : viewManagers) { + viewManager.invalidate(); } }; if (UiThreadUtil.isOnUiThread()) {