diff --git a/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java b/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java index 01af669e39d3a..6cd67c6846f49 100644 --- a/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java +++ b/tools/layoutlib/bridge/src/android/view/Choreographer_Delegate.java @@ -15,8 +15,11 @@ */ package android.view; +import com.android.ide.common.rendering.api.LayoutLog; +import com.android.layoutlib.bridge.Bridge; import com.android.tools.layoutlib.annotations.LayoutlibDelegate; +import java.lang.reflect.Field; import java.util.concurrent.atomic.AtomicReference; /** @@ -64,4 +67,17 @@ public class Choreographer_Delegate { thisChoreographer.doCallbacks(Choreographer.CALLBACK_COMMIT, frameTimeNanos); } + + public static void dispose() { + try { + Field threadInstanceField = Choreographer.class.getDeclaredField("sThreadInstance"); + @SuppressWarnings("unchecked") ThreadLocal threadInstance = + (ThreadLocal) threadInstanceField.get(null); + threadInstance.remove(); + } catch (ReflectiveOperationException e) { + assert false; + Bridge.getLog().error(LayoutLog.TAG_BROKEN, + "Unable to clear Choreographer memory.", e, null); + } + } } diff --git a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java index ce7104ee6f9bf..866b2480b828a 100644 --- a/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java +++ b/tools/layoutlib/bridge/src/com/android/layoutlib/bridge/impl/RenderSessionImpl.java @@ -1453,6 +1453,7 @@ public class RenderSessionImpl extends RenderAction { if (createdLooper) { Bridge.cleanupThread(); + Choreographer_Delegate.dispose(); } } }