Clean up View Recycling

Summary:
Followups to View Recycling diffs to improve things / clean up things a bit. This also fixes memory warnings which were not hooked up before.

Changelog: [Internal]

Reviewed By: mdvacca

Differential Revision: D36707792

fbshipit-source-id: 410e70bf0eeec5569566138af547e1601394d0e6
This commit is contained in:
Joshua Gross authored and Facebook GitHub Bot committed 2022-05-31 14:34:33 -07:00
1 parent bffad4351c
commit a68dca3c46
9 files changed
+101 -107

No files matched your search

@@ -41,15 +41,23 @@ public abstract class ViewManager<T extends View, C extends ReactShadowNode>
* null signals that View Recycling is disabled. `enableViewRecycling` must be explicitly called
* in a concrete constructor to enable View Recycling per ViewManager.
*/
private HashMap<Integer, Stack<T>> mRecyclableViews = null;
@Nullable private HashMap<Integer, Stack<T>> mRecyclableViews = null;
private int mRecyclableViewsBufferSize = 1024;
/** Call in constructor of concrete ViewManager class to enable. */
protected void enableViewRecycling() {
protected void setupViewRecycling() {
if (ReactFeatureFlags.enableViewRecycling) {
mRecyclableViews = new HashMap<>();
}
}
/** Call in constructor of concrete ViewManager class to enable. */
protected void setupViewRecycling(int bufferSize) {
mRecyclableViewsBufferSize = bufferSize;
setupViewRecycling();
}
private @Nullable Stack<T> getRecyclableViewStack(int surfaceId) {
if (mRecyclableViews == null) {
return null;
@@ -191,12 +199,16 @@ public abstract class ViewManager<T extends View, C extends ReactShadowNode>
* {@link ViewManager} subclass.
*/
public void onDropViewInstance(@NonNull T view) {
@Nullable
Stack<T> recyclableViews =
getRecyclableViewStack(((ThemedReactContext) view.getContext()).getSurfaceId());
// By default we treat views as recyclable
if (recyclableViews != null) {
recyclableViews.push(prepareToRecycleView((ThemedReactContext) view.getContext(), view));
// View recycling
ThemedReactContext themedReactContext = (ThemedReactContext) view.getContext();
int surfaceId = themedReactContext.getSurfaceId();
@Nullable Stack<T> recyclableViews = getRecyclableViewStack(surfaceId);
// Any max buffer size <0 results in an infinite buffer size
if (recyclableViews != null
&& (mRecyclableViewsBufferSize < 0
|| recyclableViews.size() < mRecyclableViewsBufferSize)) {
recyclableViews.push(prepareToRecycleView(themedReactContext, view));
}
}