From 1744335ddd2f9aacaa4bdbae6021f24c216667fc Mon Sep 17 00:00:00 2001 From: Lorenzo Blasa Date: Tue, 20 Sep 2022 05:15:50 -0700 Subject: [PATCH] View as weak reference Summary: Keep a weak reference of the view instead of a strong reference. Reviewed By: LukeDefeo Differential Revision: D39575312 fbshipit-source-id: ae8df7d089b29ea3b1cf960a6ae020ed5a9c3648 --- .../uidebugger/observers/DecorViewTreeObserver.kt | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/DecorViewTreeObserver.kt b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/DecorViewTreeObserver.kt index aec87642a..6023d56c6 100644 --- a/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/DecorViewTreeObserver.kt +++ b/android/src/main/java/com/facebook/flipper/plugins/uidebugger/observers/DecorViewTreeObserver.kt @@ -12,6 +12,7 @@ import android.view.View import android.view.ViewTreeObserver import com.facebook.flipper.plugins.uidebugger.LogTag import com.facebook.flipper.plugins.uidebugger.core.Context +import java.lang.ref.WeakReference typealias DecorView = View @@ -20,19 +21,20 @@ class DecorViewObserver(val context: Context) : TreeObserver() { val throttleTimeMs = 500 - // should this be a weak reference? - private var nodeRef: View? = null + private var nodeRef: WeakReference? = null private var listener: ViewTreeObserver.OnPreDrawListener? = null override val type = "DecorView" override fun subscribe(node: Any) { - node as View - nodeRef = node + nodeRef = WeakReference(node) Log.i(LogTag, "Subscribing to decor view changes") + // TODO: there's a problem with this. Some future changes may have been + // ignored and not sent. Need to keep track of the last one, always and react + // accordingly. listener = object : ViewTreeObserver.OnPreDrawListener { var lastSend = 0L @@ -53,7 +55,7 @@ class DecorViewObserver(val context: Context) : TreeObserver() { Log.i(LogTag, "Unsubscribing from decor view changes") listener.let { - nodeRef?.viewTreeObserver?.removeOnPreDrawListener(it) + nodeRef?.get()?.viewTreeObserver?.removeOnPreDrawListener(it) listener = null nodeRef = null } @@ -66,7 +68,7 @@ object DecorViewTreeObserverBuilder : TreeObserverBuilder { } override fun build(context: Context): TreeObserver { - Log.i(LogTag, "Building decor view observer") + Log.i(LogTag, "Building DecorView observer") return DecorViewObserver(context) } }