Fix memory leak that occurs when removing root nodes
Reviewed By: sriramramani Differential Revision: D4540427 fbshipit-source-id: 8bdc0d2318371315b95300cdc6ca10bd0dbb55dd
This commit is contained in:
Родитель
5dc64b40a5
Коммит
d768309367
|
@ -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.
|
||||||
|
|
Загрузка…
Ссылка в новой задаче