Skip to content

Commit 13415cf

Browse files
committed
fix(perf): Make FirstDrawDoneListener cleanup OnGlobalLayoutListener after use
The OnGlobalLayoutListener registered in onDraw() to defer removal of the OnDrawListener was never itself removed. In single-Activity apps this causes an unbounded per-navigation leak on the ViewTreeObserver, accumulating one listener per registerForNextDraw call. Make the OnGlobalLayoutListener remove itself after firing.
1 parent fdbf6f7 commit 13415cf

1 file changed

Lines changed: 8 additions & 1 deletion

File tree

firebase-perf/src/main/java/com/google/firebase/perf/util/FirstDrawDoneListener.java

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,14 @@ public void onDraw() {
7373
// OnDrawListeners cannot be removed within onDraw, so we remove it with a
7474
// GlobalLayoutListener
7575
view.getViewTreeObserver()
76-
.addOnGlobalLayoutListener(() -> view.getViewTreeObserver().removeOnDrawListener(this));
76+
.addOnGlobalLayoutListener(
77+
new ViewTreeObserver.OnGlobalLayoutListener() {
78+
@Override
79+
public void onGlobalLayout() {
80+
view.getViewTreeObserver().removeOnGlobalLayoutListener(this);
81+
view.getViewTreeObserver().removeOnDrawListener(FirstDrawDoneListener.this);
82+
}
83+
});
7784
mainThreadHandler.postAtFrontOfQueue(callback);
7885
}
7986

0 commit comments

Comments
 (0)