From 0c6e2c957bc5cb3f0bbfcd7fc69fb64560e87898 Mon Sep 17 00:00:00 2001 From: Samantha Houts Date: Wed, 19 Jun 2019 15:55:59 -0700 Subject: [PATCH] [Android] Add disposed check to MasterDetailPageRenderer (#6354) * [Android] Add disposed check to MasterDetailPageRenderer Co-Authored-By: Felipe Silveira * Fix dispose pattern a la #6305 * apply same set of changes to NavigationPageRenderer fixes #3489 closes #4586 --- .../AppCompat/MasterDetailPageRenderer.cs | 12 ++++++++---- .../AppCompat/NavigationPageRenderer.cs | 11 +++++++---- .../Extensions/JavaObjectExtensions.cs | 7 +++++++ 3 files changed, 22 insertions(+), 8 deletions(-) diff --git a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs index 45b3764..c7c2f1a 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/MasterDetailPageRenderer.cs @@ -207,10 +207,13 @@ namespace Xamarin.Forms.Platform.Android.AppCompat protected override void Dispose(bool disposing) { - if (disposing && !_disposed) - { - _disposed = true; + if (_disposed) + return; + _disposed = true; + + if (disposing) + { if (_tracker != null) { _tracker.Dispose(); @@ -236,7 +239,8 @@ namespace Xamarin.Forms.Platform.Android.AppCompat Device.Info.PropertyChanged -= DeviceInfoPropertyChanged; - RemoveDrawerListener(this); + if (!this.IsDisposed()) + RemoveDrawerListener(this); if (Element != null) { diff --git a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs index 18b18b4..976b977 100644 --- a/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs +++ b/Xamarin.Forms.Platform.Android/AppCompat/NavigationPageRenderer.cs @@ -161,10 +161,13 @@ namespace Xamarin.Forms.Platform.Android.AppCompat protected override void Dispose(bool disposing) { - if (disposing && !_disposed) - { - _disposed = true; + if (_disposed) + return; + _disposed = true; + + if (disposing) + { if (_titleViewRenderer != null) { Android.Platform.ClearRenderer(_titleViewRenderer.View); @@ -196,7 +199,7 @@ namespace Xamarin.Forms.Platform.Android.AppCompat _toolbar = null; } - if (_drawerLayout != null && _drawerListener != null) + if (_drawerLayout.IsAlive() && _drawerListener.IsAlive()) { _drawerLayout.RemoveDrawerListener(_drawerListener); } diff --git a/Xamarin.Forms.Platform.Android/Extensions/JavaObjectExtensions.cs b/Xamarin.Forms.Platform.Android/Extensions/JavaObjectExtensions.cs index 007d875..dea3b53 100644 --- a/Xamarin.Forms.Platform.Android/Extensions/JavaObjectExtensions.cs +++ b/Xamarin.Forms.Platform.Android/Extensions/JavaObjectExtensions.cs @@ -8,5 +8,12 @@ namespace Xamarin.Forms.Platform.Android { return obj.Handle == IntPtr.Zero; } + public static bool IsAlive(this Java.Lang.Object obj) + { + if (obj == null) + return false; + + return !obj.IsDisposed(); + } } } \ No newline at end of file -- 2.7.4