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

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

@ -20,11 +20,26 @@ import com.facebook.react.uimanager.events.EventDispatcher;
* UIImplementationProvider that creates instances of {@link FlatUIImplementation}.
*/
public final class FlatUIImplementationProvider extends UIImplementationProvider {
private final boolean mMemoryImprovementEnabled;
public FlatUIImplementationProvider() {
mMemoryImprovementEnabled = true;
}
public FlatUIImplementationProvider(boolean memoryImprovementEnabled) {
mMemoryImprovementEnabled = memoryImprovementEnabled;
}
@Override
public FlatUIImplementation createUIImplementation(
ReactApplicationContext reactContext,
List<ViewManager> viewManagers,
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.
*/
public void removeRootView(int rootViewTag) {
mShadowNodeRegistry.removeRootNode(rootViewTag);
removeRootShadowNode(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)
* has its size changed.