diff --git a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java index 0a35242d1..91098711e 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java +++ b/ReactAndroid/src/main/java/com/facebook/react/fabric/FabricUIManager.java @@ -66,6 +66,7 @@ public class FabricUIManager implements UIManager, JSHandler { private final FabricReconciler mFabricReconciler; private final EventDispatcher mEventDispatcher; private FabricBinding mBinding; + private final FabricEventEmitter mFabricEventEmitter; private long mEventHandlerPointer; public FabricUIManager( @@ -81,6 +82,8 @@ public class FabricUIManager implements UIManager, JSHandler { new UIViewOperationQueue( reactContext, mNativeViewHierarchyManager, 0); mFabricReconciler = new FabricReconciler(mUIViewOperationQueue); + mFabricEventEmitter = + new FabricEventEmitter(mReactApplicationContext, this); mEventDispatcher = eventDispatcher; mJSContext = jsContext; } @@ -537,12 +540,14 @@ public class FabricUIManager implements UIManager, JSHandler { public void initialize() { FabricEventEmitter eventEmitter = new FabricEventEmitter(mReactApplicationContext, this); - mEventDispatcher.registerEventEmitter(FABRIC, eventEmitter); + mEventDispatcher.registerEventEmitter(FABRIC, mFabricEventEmitter); } @Override public void onCatalystInstanceDestroy() { mBinding.releaseEventHandler(mJSContext.get(), mEventHandlerPointer); + mEventDispatcher.unregisterEventEmitter(FABRIC); + mFabricEventEmitter.close(); } } diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/EventDispatcher.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/EventDispatcher.java index cd8b44eb9..d983eebeb 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/EventDispatcher.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/EventDispatcher.java @@ -161,7 +161,6 @@ public class EventDispatcher implements LifecycleEventListener { @Override public void onHostDestroy() { stopFrameCallback(); - mReactEventEmitter.stop(); } public void onCatalystInstanceDestroyed() { @@ -254,6 +253,10 @@ public class EventDispatcher implements LifecycleEventListener { mReactEventEmitter.register(uiManagerType, eventEmitter); } + public void unregisterEventEmitter(@UIManagerType int uiManagerType) { + mReactEventEmitter.unregister(uiManagerType); + } + private class ScheduleDispatchFrameCallback extends ChoreographerCompat.FrameCallback { private volatile boolean mIsPosted = false; private boolean mShouldStop = false; diff --git a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/ReactEventEmitter.java b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/ReactEventEmitter.java index c54af2212..5d07b3564 100644 --- a/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/ReactEventEmitter.java +++ b/ReactAndroid/src/main/java/com/facebook/react/uimanager/events/ReactEventEmitter.java @@ -31,6 +31,10 @@ public class ReactEventEmitter implements RCTEventEmitter { mEventEmitters.put(uiManagerType, eventEmitter); } + public void unregister(@UIManagerType int uiManagerType) { + mEventEmitters.remove(uiManagerType); + } + @Override public void receiveEvent(int targetReactTag, String eventName, @Nullable WritableMap event) { getEventEmitter(targetReactTag).receiveEvent(targetReactTag, eventName, event); @@ -52,17 +56,4 @@ public class ReactEventEmitter implements RCTEventEmitter { int type = ViewUtil.getUIManagerType(reactTag); return mEventEmitters.get(type); } - - public void stop() { - for (int i = 0 ; i < mEventEmitters.size() ; i++) { - RCTEventEmitter eventEmitter = mEventEmitters.valueAt(i); - if (eventEmitter instanceof Closeable) { - try { - ((Closeable) eventEmitter).close(); - } catch (IOException e) { - Log.i(TAG, "Exception when closing EventEmitter: " + eventEmitter, e); - } - } - } - } }