diff --git a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/ReactInstanceManagerTest.java b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/ReactInstanceManagerTest.java index e7cdff2453e92e..e03721be842f6c 100644 --- a/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/ReactInstanceManagerTest.java +++ b/ReactAndroid/src/androidTest/java/com/facebook/react/tests/core/ReactInstanceManagerTest.java @@ -6,6 +6,7 @@ package com.facebook.react.tests.core; import android.app.Activity; +import android.support.test.InstrumentationRegistry; import android.support.test.annotation.UiThreadTest; import android.support.test.rule.ActivityTestRule; import android.support.test.runner.AndroidJUnit4; @@ -14,6 +15,7 @@ import com.facebook.react.common.LifecycleState; import com.facebook.react.shell.MainReactPackage; import com.facebook.react.testing.ReactTestHelper; +import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -43,6 +45,19 @@ public void setup() { .build(); } + @After + public void tearDown() { + final ReactRootView reactRootView = mReactRootView; + final ReactInstanceManager reactInstanceManager = mReactInstanceManager; + InstrumentationRegistry.getInstrumentation().runOnMainSync(new Runnable() { + @Override + public void run() { + reactRootView.unmountReactApplication(); + reactInstanceManager.destroy(); + } + }); + } + @Test @UiThreadTest public void testMountUnmount() { @@ -56,7 +71,6 @@ public void testMountUnmount() { public void testResume() throws InterruptedException { mReactInstanceManager.onHostResume(mActivityRule.getActivity()); mReactRootView.startReactApplication(mReactInstanceManager, TEST_MODULE); - Thread.sleep(1000); mReactInstanceManager.onHostResume(mActivityRule.getActivity()); } @@ -65,7 +79,14 @@ public void testResume() throws InterruptedException { public void testRecreateContext() throws InterruptedException { mReactInstanceManager.onHostResume(mActivityRule.getActivity()); mReactInstanceManager.createReactContextInBackground(); - Thread.sleep(1000); mReactRootView.startReactApplication(mReactInstanceManager, TEST_MODULE); } + + @Test + @UiThreadTest + public void testMountTwice() { + mReactInstanceManager.onHostResume(mActivityRule.getActivity()); + mReactRootView.startReactApplication(mReactInstanceManager, TEST_MODULE); + mReactInstanceManager.attachRootView(mReactRootView); + } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index e79ef488c807d9..d791cfbe1e6b68 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -99,6 +99,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; import javax.annotation.Nullable; /** @@ -134,8 +135,8 @@ public interface ReactInstanceEventListener { void onReactContextInitialized(ReactContext context); } - private final List mAttachedRootViews = Collections.synchronizedList( - new ArrayList()); + private final Set mAttachedRootViews = Collections.synchronizedSet( + new HashSet()); private volatile LifecycleState mLifecycleState; @@ -1037,8 +1038,7 @@ public void run() { }); } - private void attachRootViewToInstance( - final ReactRootView rootView) { + private void attachRootViewToInstance(final ReactRootView rootView) { Log.d(ReactConstants.TAG, "ReactInstanceManager.attachRootViewToInstance()"); Systrace.beginSection(TRACE_TAG_REACT_JAVA_BRIDGE, "attachRootViewToInstance"); UIManager uiManagerModule = UIManagerHelper.getUIManager(mCurrentReactContext, rootView.getUIManagerType());