diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java index 17fb538b8..1bcd68cc2 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManager.java @@ -136,6 +136,11 @@ public abstract class ReactInstanceManager { */ public abstract void addReactInstanceEventListener(ReactInstanceEventListener listener); + /** + * Remove a listener previously added with {@link #addReactInstanceEventListener}. + */ + public abstract void removeReactInstanceEventListener(ReactInstanceEventListener listener); + @VisibleForTesting public abstract @Nullable ReactContext getCurrentReactContext(); diff --git a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerImpl.java b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerImpl.java index c4f550495..88a064c6c 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerImpl.java +++ b/ReactAndroid/src/main/java/com/facebook/react/ReactInstanceManagerImpl.java @@ -15,7 +15,10 @@ import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; +import java.util.HashSet; import java.util.List; +import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; import android.app.Activity; @@ -110,7 +113,7 @@ import static com.facebook.react.bridge.ReactMarkerConstants.*; private String mSourceUrl; private @Nullable Activity mCurrentActivity; private final Collection mReactInstanceEventListeners = - new ConcurrentLinkedQueue<>(); + Collections.synchronizedSet(new HashSet()); private volatile boolean mHasStartedCreatingInitialContext = false; private final UIImplementationProvider mUIImplementationProvider; private final MemoryPressureRouter mMemoryPressureRouter; @@ -599,6 +602,11 @@ import static com.facebook.react.bridge.ReactMarkerConstants.*; mReactInstanceEventListeners.add(listener); } + @Override + public void removeReactInstanceEventListener(ReactInstanceEventListener listener) { + mReactInstanceEventListeners.remove(listener); + } + @VisibleForTesting @Override public @Nullable ReactContext getCurrentReactContext() {