From 149259de64dbf991b25db7a7482082f1b966a3ef Mon Sep 17 00:00:00 2001 From: Seth Madison Date: Wed, 18 Jul 2018 16:06:36 -0700 Subject: [PATCH] Fix memory leak: remove references to SvgViews in onDetachedFromWindow It looks like onDropViewInstance does not get called when the entire react instance is shut down from the native side. To gaurantee that we do not leak memory, we need to remove the reference to the view in onDetachedFromWindow(). --- android/src/main/java/com/horcrux/svg/SvgView.java | 6 ++++++ .../main/java/com/horcrux/svg/SvgViewManager.java | 13 ++++++------- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/android/src/main/java/com/horcrux/svg/SvgView.java b/android/src/main/java/com/horcrux/svg/SvgView.java index 21d91127..f8d36fff 100644 --- a/android/src/main/java/com/horcrux/svg/SvgView.java +++ b/android/src/main/java/com/horcrux/svg/SvgView.java @@ -72,6 +72,12 @@ public class SvgView extends ViewGroup { SvgViewManager.setSvgView(this); } + @Override + protected void onDetachedFromWindow() { + super.onDetachedFromWindow(); + SvgViewManager.dropSvgView(this); + } + public void setBitmap(Bitmap bitmap) { if (mBitmap != null) { mBitmap.recycle(); diff --git a/android/src/main/java/com/horcrux/svg/SvgViewManager.java b/android/src/main/java/com/horcrux/svg/SvgViewManager.java index 150e96e2..6f388741 100644 --- a/android/src/main/java/com/horcrux/svg/SvgViewManager.java +++ b/android/src/main/java/com/horcrux/svg/SvgViewManager.java @@ -51,6 +51,12 @@ class SvgViewManager extends ViewGroupManager { mTagToSvgView.put(svg.getId(), svg); } + static void dropSvgView(SvgView view) { + int tag = view.getId(); + mTagToShadowNode.remove(tag); + mTagToSvgView.remove(tag); + } + @SuppressWarnings("unused") static @Nullable SvgView getSvgViewByTag(int tag) { return mTagToSvgView.get(tag); @@ -77,13 +83,6 @@ class SvgViewManager extends ViewGroupManager { return node; } - @Override - public void onDropViewInstance(SvgView view) { - int tag = view.getId(); - mTagToShadowNode.remove(tag); - mTagToSvgView.remove(tag); - } - @Override protected SvgView createViewInstance(ThemedReactContext reactContext) { return new SvgView(reactContext);