Remove referenced to dropped views

Summary:
There is currently a bug where we never release any Views that no longer display, still storing hard references in NativeViewHierarchyManager. This diff is fixing this bug, and here is how:

a) there is already logic in place to drop FlatShadowNodes (UIImplementation.removeShadowNode).
b) there is already logic in place to drop Views (NativeViewHierarchyManager.dropView(int reactTag) - used to private but needs to be protected so I can call it)
c) (the missing part) when we are about to drop a FlatShadowNode, check if it mount to a View (i.e. there is a View associated with that node), put it into a ArrayList. When we finished updates to a nodes hierarchy (which happens in non-UI thread), collect ids from those nodes and enqueue a UIOperation that will drop all the Views. We can either forward nodes as FlatShadowNode[], or only ids as int[]. Both should be fine, but as a rule of thumb we don't touch shadow node hierarchy from UI thread (as we don't touch Views from non-UI thread) so passing int[] is what this code is doing.

Reviewed By: ahmedre

Differential Revision: D2757310
This commit is contained in:
Denis Koroskin
2015-12-16 10:05:43 -08:00
committed by Ahmed El-Helw
parent e9753a11ae
commit ad65b2a9e1
4 changed files with 39 additions and 1 deletions

View File

@@ -40,6 +40,7 @@ import com.facebook.react.uimanager.CatalystStylesDiffMap;
private final ArrayList<FlatShadowNode> mViewsToDetachAllChildrenFrom = new ArrayList<>();
private final ArrayList<FlatShadowNode> mViewsToDetach = new ArrayList<>();
private final ArrayList<FlatShadowNode> mViewsToUpdateBounds = new ArrayList<>();
private final ArrayList<FlatShadowNode> mViewsToDrop = new ArrayList<>();
private @Nullable FlatUIViewOperationQueue.DetachAllChildrenFromViews mDetachAllChildrenFromViews;
@@ -78,6 +79,11 @@ import com.facebook.react.uimanager.CatalystStylesDiffMap;
updateViewBounds(mViewsToUpdateBounds.get(i));
}
mViewsToUpdateBounds.clear();
if (!mViewsToDrop.isEmpty()) {
mOperationsQueue.enqueueDropViews(collectViewTags(mViewsToDrop));
mViewsToDrop.clear();
}
}
/**
@@ -107,6 +113,10 @@ import com.facebook.react.uimanager.CatalystStylesDiffMap;
node.signalBackingViewIsCreated();
}
/* package */ void dropView(FlatShadowNode node) {
mViewsToDrop.add(node);
}
private void addNodeRegion(NodeRegion nodeRegion) {
mNodeRegions.add(nodeRegion);
}