Fix memory leak that occurs when removing root nodes

Reviewed By: sriramramani

Differential Revision: D4540427

fbshipit-source-id: 8bdc0d2318371315b95300cdc6ca10bd0dbb55dd
This commit is contained in:
Andrew Y. Chen 2017-02-15 12:21:51 -08:00 коммит произвёл Facebook Github Bot
Родитель 5dc64b40a5
Коммит d768309367
3 изменённых файлов: 35 добавлений и 5 удалений

Просмотреть файл

@ -37,7 +37,8 @@ public class FlatUIImplementation extends UIImplementation {
public static FlatUIImplementation createInstance( public static FlatUIImplementation createInstance(
ReactApplicationContext reactContext, ReactApplicationContext reactContext,
List<ViewManager> viewManagers, List<ViewManager> viewManagers,
EventDispatcher eventDispatcher) { EventDispatcher eventDispatcher,
boolean memoryImprovementEnabled) {
RCTImageViewManager rctImageViewManager = findRCTImageManager(viewManagers); RCTImageViewManager rctImageViewManager = findRCTImageManager(viewManagers);
if (rctImageViewManager != null) { if (rctImageViewManager != null) {
@ -61,7 +62,8 @@ public class FlatUIImplementation extends UIImplementation {
rctImageViewManager, rctImageViewManager,
viewManagerRegistry, viewManagerRegistry,
operationsQueue, operationsQueue,
eventDispatcher eventDispatcher,
memoryImprovementEnabled
); );
} }
@ -73,17 +75,20 @@ public class FlatUIImplementation extends UIImplementation {
private final ReactApplicationContext mReactContext; private final ReactApplicationContext mReactContext;
private @Nullable RCTImageViewManager mRCTImageViewManager; private @Nullable RCTImageViewManager mRCTImageViewManager;
private final StateBuilder mStateBuilder; private final StateBuilder mStateBuilder;
private final boolean mMemoryImprovementEnabled;
private FlatUIImplementation( private FlatUIImplementation(
ReactApplicationContext reactContext, ReactApplicationContext reactContext,
@Nullable RCTImageViewManager rctImageViewManager, @Nullable RCTImageViewManager rctImageViewManager,
ViewManagerRegistry viewManagers, ViewManagerRegistry viewManagers,
FlatUIViewOperationQueue operationsQueue, FlatUIViewOperationQueue operationsQueue,
EventDispatcher eventDispatcher) { EventDispatcher eventDispatcher,
boolean memoryImprovementEnabled) {
super(reactContext, viewManagers, operationsQueue, eventDispatcher); super(reactContext, viewManagers, operationsQueue, eventDispatcher);
mReactContext = reactContext; mReactContext = reactContext;
mRCTImageViewManager = rctImageViewManager; mRCTImageViewManager = rctImageViewManager;
mStateBuilder = new StateBuilder(operationsQueue); mStateBuilder = new StateBuilder(operationsQueue);
mMemoryImprovementEnabled = memoryImprovementEnabled;
} }
@Override @Override
@ -521,6 +526,9 @@ public class FlatUIImplementation extends UIImplementation {
@Override @Override
public void removeRootView(int rootViewTag) { public void removeRootView(int rootViewTag) {
if (mMemoryImprovementEnabled) {
removeRootShadowNode(rootViewTag);
}
mStateBuilder.removeRootView(rootViewTag); mStateBuilder.removeRootView(rootViewTag);
} }

Просмотреть файл

@ -20,11 +20,26 @@ import com.facebook.react.uimanager.events.EventDispatcher;
* UIImplementationProvider that creates instances of {@link FlatUIImplementation}. * UIImplementationProvider that creates instances of {@link FlatUIImplementation}.
*/ */
public final class FlatUIImplementationProvider extends UIImplementationProvider { public final class FlatUIImplementationProvider extends UIImplementationProvider {
private final boolean mMemoryImprovementEnabled;
public FlatUIImplementationProvider() {
mMemoryImprovementEnabled = true;
}
public FlatUIImplementationProvider(boolean memoryImprovementEnabled) {
mMemoryImprovementEnabled = memoryImprovementEnabled;
}
@Override @Override
public FlatUIImplementation createUIImplementation( public FlatUIImplementation createUIImplementation(
ReactApplicationContext reactContext, ReactApplicationContext reactContext,
List<ViewManager> viewManagers, List<ViewManager> viewManagers,
EventDispatcher eventDispatcher) { EventDispatcher eventDispatcher) {
return FlatUIImplementation.createInstance(reactContext, viewManagers, eventDispatcher); return FlatUIImplementation.createInstance(
reactContext,
viewManagers,
eventDispatcher,
mMemoryImprovementEnabled);
} }
} }

Просмотреть файл

@ -133,10 +133,17 @@ public class UIImplementation {
* Unregisters a root node with a given tag. * Unregisters a root node with a given tag.
*/ */
public void removeRootView(int rootViewTag) { public void removeRootView(int rootViewTag) {
mShadowNodeRegistry.removeRootNode(rootViewTag); removeRootShadowNode(rootViewTag);
mOperationsQueue.enqueueRemoveRootView(rootViewTag); mOperationsQueue.enqueueRemoveRootView(rootViewTag);
} }
/**
* Unregisters a root node with a given tag from the shadow node registry
*/
public void removeRootShadowNode(int rootViewTag) {
mShadowNodeRegistry.removeRootNode(rootViewTag);
}
/** /**
* Invoked when native view that corresponds to a root node, or acts as a root view (ie. Modals) * Invoked when native view that corresponds to a root node, or acts as a root view (ie. Modals)
* has its size changed. * has its size changed.