diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2016-08-30 11:57:55 -0600 |
---|---|---|
committer | Jason Smith <jason.smith@xamarin.com> | 2016-08-30 10:57:55 -0700 |
commit | 974705b9a920e71ecaa9f5e0d58cf6d80a1d71cf (patch) | |
tree | caa8ac25f603ee796f455846e615011afb9b702a /Xamarin.Forms.Platform.Android | |
parent | a0dae2d111a5fc59a272f5b8a27885a54dcf6f32 (diff) | |
download | xamarin-forms-974705b9a920e71ecaa9f5e0d58cf6d80a1d71cf.tar.gz xamarin-forms-974705b9a920e71ecaa9f5e0d58cf6d80a1d71cf.tar.bz2 xamarin-forms-974705b9a920e71ecaa9f5e0d58cf6d80a1d71cf.zip |
Fix memory leak caused by BaseCellView and RendererHolder (#311)
Diffstat (limited to 'Xamarin.Forms.Platform.Android')
-rw-r--r-- | Xamarin.Forms.Platform.Android/Cells/BaseCellView.cs | 8 | ||||
-rw-r--r-- | Xamarin.Forms.Platform.Android/Cells/CellRenderer.cs | 31 |
2 files changed, 32 insertions, 7 deletions
diff --git a/Xamarin.Forms.Platform.Android/Cells/BaseCellView.cs b/Xamarin.Forms.Platform.Android/Cells/BaseCellView.cs index 74c56dbd..c4d10cc4 100644 --- a/Xamarin.Forms.Platform.Android/Cells/BaseCellView.cs +++ b/Xamarin.Forms.Platform.Android/Cells/BaseCellView.cs @@ -18,7 +18,7 @@ namespace Xamarin.Forms.Platform.Android public const double DefaultMinHeight = 44; readonly Color _androidDefaultTextColor; - readonly Cell _cell; + Cell _cell; readonly TextView _detailText; readonly ImageView _imageView; readonly TextView _mainText; @@ -179,6 +179,12 @@ namespace Xamarin.Forms.Platform.Android LayoutParameters = new LayoutParams(ViewGroup.LayoutParams.MatchParent, (int)(height == -1 ? ViewGroup.LayoutParams.WrapContent : height)); } + protected override void OnDetachedFromWindow() + { + base.OnDetachedFromWindow(); + _cell = null; + } + async void UpdateBitmap(ImageSource source, ImageSource previousSource = null) { if (Equals(source, previousSource)) diff --git a/Xamarin.Forms.Platform.Android/Cells/CellRenderer.cs b/Xamarin.Forms.Platform.Android/Cells/CellRenderer.cs index e62a8d4e..fd7cd89e 100644 --- a/Xamarin.Forms.Platform.Android/Cells/CellRenderer.cs +++ b/Xamarin.Forms.Platform.Android/Cells/CellRenderer.cs @@ -24,7 +24,7 @@ namespace Xamarin.Forms.Platform.Android public AView GetCell(Cell item, AView convertView, ViewGroup parent, Context context) { Performance.Start(); - + Cell = item; Cell.PropertyChanged -= PropertyChangedHandler; @@ -33,14 +33,18 @@ namespace Xamarin.Forms.Platform.Android if (convertView != null) { Object tag = convertView.Tag; - var renderHolder = tag as RendererHolder; - if (renderHolder != null) + CellRenderer renderer = (tag as RendererHolder)?.Renderer; + + Cell oldCell = renderer?.Cell; + + if (oldCell != null) { - Cell oldCell = renderHolder.Renderer.Cell; ((ICellController)oldCell).SendDisappearing(); if (Cell != oldCell) + { SetRenderer(oldCell, null); + } } } @@ -50,7 +54,7 @@ namespace Xamarin.Forms.Platform.Android var holder = view.Tag as RendererHolder; if (holder == null) - view.Tag = new RendererHolder { Renderer = this }; + view.Tag = new RendererHolder(this); else holder.Renderer = this; @@ -126,7 +130,22 @@ namespace Xamarin.Forms.Platform.Android class RendererHolder : Object { - public CellRenderer Renderer; + readonly WeakReference<CellRenderer> _rendererRef; + + public RendererHolder(CellRenderer renderer) + { + _rendererRef = new WeakReference<CellRenderer>(renderer); + } + + public CellRenderer Renderer + { + get + { + CellRenderer renderer; + return _rendererRef.TryGetTarget(out renderer) ? renderer : null; + } + set { _rendererRef.SetTarget(value); } + } } } }
\ No newline at end of file |