diff options
author | E.Z. Hart <hartez@users.noreply.github.com> | 2016-06-27 09:20:47 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-06-27 09:20:47 -0600 |
commit | 589adbd3ef145ec85f9fe64eda008251c1cdb745 (patch) | |
tree | 298a476d1fa22a4ab19138d8ce27e2265956f1bf /Xamarin.Forms.Platform.Android/Renderers | |
parent | b15ee30765184944d2adf0917de1e6d4b5454853 (diff) | |
download | xamarin-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.cs | 27 |
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) |