From f1015664e92f02c33417a591a2438db7c0cd3811 Mon Sep 17 00:00:00 2001 From: Dmitry Zakharov Date: Mon, 20 Nov 2017 07:27:47 -0800 Subject: [PATCH] Fix crash when destroying catalyst Reviewed By: fromcelticpark Differential Revision: D6373275 fbshipit-source-id: c36b53f023800097b301d530250b05e5b2a4dfca --- .../facebook/react/ReactInstanceManager.java | 22 ++++++++++++++----- .../ViewManagerOnDemandReactPackage.java | 2 +- 2 files changed, 18 insertions(+), 6 deletions(-) diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index d9f4975fb..bc2a500ac 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -764,8 +764,14 @@ public class ReactInstanceManager { } public @Nullable ViewManager createViewManager(String viewManagerName) { - ReactApplicationContext context = - Assertions.assertNotNull((ReactApplicationContext) getCurrentReactContext()); + ReactApplicationContext context; + synchronized (mReactContextLock) { + context = (ReactApplicationContext) getCurrentReactContext(); + if (context == null || !context.hasActiveCatalystInstance()) { + return null; + } + } + synchronized (mPackages) { for (ReactPackage reactPackage : mPackages) { if (reactPackage instanceof ViewManagerOnDemandReactPackage) { @@ -781,9 +787,15 @@ public class ReactInstanceManager { return null; } - public List getViewManagerNames() { - ReactApplicationContext context = - Assertions.assertNotNull((ReactApplicationContext) getCurrentReactContext()); + public @Nullable List getViewManagerNames() { + ReactApplicationContext context; + synchronized(mReactContextLock) { + context = (ReactApplicationContext) getCurrentReactContext(); + if (context == null || !context.hasActiveCatalystInstance()) { + return null; + } + } + synchronized (mPackages) { Set uniqueNames = new HashSet<>(); for (ReactPackage reactPackage : mPackages) { diff --git a/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.java b/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.java index 1e0ee9570..e78d0ca2f 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ViewManagerOnDemandReactPackage.java @@ -21,7 +21,7 @@ public interface ViewManagerOnDemandReactPackage { * * @param loadClasses defines if View Managers classes should be loaded or be avoided. */ - List getViewManagerNames(ReactApplicationContext reactContext, boolean loadClasses); + @Nullable List getViewManagerNames(ReactApplicationContext reactContext, boolean loadClasses); /** * Creates and returns a ViewManager with a specific name {@param viewManagerName}. It's up to an * implementing package how to interpret the name.