summaryrefslogtreecommitdiff
path: root/Xamarin.Forms.Platform.Android/Renderers
diff options
context:
space:
mode:
authorE.Z. Hart <hartez@users.noreply.github.com>2016-06-27 09:20:47 -0600
committerGitHub <noreply@github.com>2016-06-27 09:20:47 -0600
commit589adbd3ef145ec85f9fe64eda008251c1cdb745 (patch)
tree298a476d1fa22a4ab19138d8ce27e2265956f1bf /Xamarin.Forms.Platform.Android/Renderers
parentb15ee30765184944d2adf0917de1e6d4b5454853 (diff)
downloadxamarin-forms-589adbd3ef145ec85f9fe64eda008251c1cdb745.tar.gz
xamarin-forms-589adbd3ef145ec85f9fe64eda008251c1cdb745.tar.bz2
xamarin-forms-589adbd3ef145ec85f9fe64eda008251c1cdb745.zip
[Android] Memory leak when MasterDetailPage Detail set to NavigationPage (#239)
* Create repro * Remove unnecessary cast * Add null checks on weak references in PageContainer * Remove master/detail fragments from manager when switching master/detail pages Separate renderer ViewGroup removal from renderer disposal in FragmentContainer Separate PageContainer disposal from renderer disposal in FragmentContainer Remove Drawer Listener for NavigationPageRenderer in Dispose * Fix missing spaces; Add explicit SPACE_BEFORE_IF_PARENTHESES settings to DotSettings file * Remove javascript rules * Remove usage of .ForEach()
Diffstat (limited to 'Xamarin.Forms.Platform.Android/Renderers')
-rw-r--r--Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs27
1 files changed, 19 insertions, 8 deletions
diff --git a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs
index f326cb3c..3fbfa096 100644
--- a/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs
+++ b/Xamarin.Forms.Platform.Android/Renderers/NavigationRenderer.cs
@@ -14,6 +14,7 @@ namespace Xamarin.Forms.Platform.Android
static ViewPropertyAnimator s_currentAnimation;
Page _current;
+ bool _disposed;
public NavigationRenderer()
{
@@ -39,17 +40,24 @@ namespace Xamarin.Forms.Platform.Android
protected override void Dispose(bool disposing)
{
- if (disposing)
+ if (disposing && !_disposed)
{
- foreach (VisualElement child in PageController.InternalChildren)
- {
- IVisualElementRenderer renderer = Platform.GetRenderer(child);
- if (renderer != null)
- renderer.Dispose();
- }
+ _disposed = true;
if (Element != null)
{
+ foreach (Element element in PageController.InternalChildren)
+ {
+ var child = (VisualElement)element;
+ if (child == null)
+ {
+ continue;
+ }
+
+ IVisualElementRenderer renderer = Platform.GetRenderer(child);
+ renderer?.Dispose();
+ }
+
var navController = (INavigationPageController)Element;
navController.PushRequested -= OnPushed;
@@ -101,7 +109,10 @@ namespace Xamarin.Forms.Platform.Android
newNavController.RemovePageRequested += OnRemovePageRequested;
// If there is already stuff on the stack we need to push it
- newNavController.StackCopy.Reverse().ForEach(p => PushViewAsync(p, false));
+ foreach(Page page in newNavController.StackCopy.Reverse())
+ {
+ PushViewAsync(page, false);
+ }
}
protected override void OnLayout(bool changed, int l, int t, int r, int b)