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 6f5ae88ee..2dccb7580 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/CatalystInstanceImpl.java @@ -287,6 +287,7 @@ public class CatalystInstanceImpl implements CatalystInstance { // TODO: tell all APIs to shut down mDestroyed = true; + mNativeModulesQueueThread.runOnQueue(new Runnable() { @Override public void run() { @@ -297,7 +298,14 @@ public class CatalystInstanceImpl implements CatalystInstance { listener.onTransitionToBridgeIdle(); } } - mHybridData.resetNative(); + UiThreadUtil.runOnUiThread(new Runnable() { + @Override + public void run() { + mHybridData.resetNative(); + // Kill non-UI threads from UI thread. + getReactQueueConfiguration().destroy(); + } + }); } }); diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/ReactQueueConfiguration.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/ReactQueueConfiguration.java index 1cab51369..68a42a82f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/ReactQueueConfiguration.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/ReactQueueConfiguration.java @@ -26,4 +26,5 @@ public interface ReactQueueConfiguration { MessageQueueThread getUIBackgroundQueueThread(); MessageQueueThread getNativeModulesQueueThread(); MessageQueueThread getJSQueueThread(); + void destroy(); } diff --git a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/ReactQueueConfigurationImpl.java b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/ReactQueueConfigurationImpl.java index 367fec1ae..05b37c597 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/ReactQueueConfigurationImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/bridge/queue/ReactQueueConfigurationImpl.java @@ -60,6 +60,10 @@ public class ReactQueueConfigurationImpl implements ReactQueueConfiguration { * is destroyed so that we shut down the proper queue threads. */ public void destroy() { + if (mUIBackgroundQueueThread != null && + mUIBackgroundQueueThread.getLooper() != Looper.getMainLooper()) { + mUIBackgroundQueueThread.quitSynchronous(); + } if (mNativeModulesQueueThread.getLooper() != Looper.getMainLooper()) { mNativeModulesQueueThread.quitSynchronous(); }