maui-linux/Xamarin.Forms.Controls.Issues/Xamarin.Forms.Controls.Issu.../Bugzilla32206.cs

142 строки
3.3 KiB
C#

using System;
using System.Collections.Generic;
using Xamarin.Forms.CustomAttributes;
using Xamarin.Forms.Internals;
using System.Threading;
#if UITEST
using Xamarin.UITest;
using NUnit.Framework;
#endif
namespace Xamarin.Forms.Controls.Issues
{
[Preserve(AllMembers = true)]
[Issue(IssueTracker.Bugzilla, 32206, "ContextActions cause memory leak: Page is never destroyed", PlatformAffected.iOS)]
public class Bugzilla32206 : TestNavigationPage
{
protected override void Init()
{
PushAsync(new LandingPage32206());
}
#if UITEST && __IOS__
[Test]
public void Bugzilla32206Test()
{
for (var n = 0; n < 10; n++)
{
RunningApp.WaitForElement(q => q.Marked("Push"));
RunningApp.Tap(q => q.Marked("Push"));
RunningApp.WaitForElement(q => q.Marked("ListView"));
RunningApp.Back();
}
// At this point, the counter can be any value, but it's most likely not zero.
// Invoking GC once is enough to clean up all garbage data and set counter to zero
RunningApp.WaitForElement(q => q.Marked("GC"));
RunningApp.Tap(q => q.Marked("GC"));
RunningApp.WaitForElement(q => q.Marked("Counter: 0"));
}
#endif
}
[Preserve(AllMembers = true)]
public class LandingPage32206 : ContentPage
{
public static int Counter;
public Label Label;
public LandingPage32206()
{
Label = new Label
{
Text = "Counter: " + Counter,
HorizontalTextAlignment = TextAlignment.Center,
VerticalTextAlignment = TextAlignment.Center
};
Content = new StackLayout
{
Orientation = StackOrientation.Vertical,
HorizontalOptions = LayoutOptions.Center,
VerticalOptions = LayoutOptions.Center,
Spacing = 15,
Children =
{
new Label
{
Text = "Click Push to show a ListView. When you hit the Back button, Counter will show the number of pages that have not been finalized yet."
+ " If you click GC, the counter should be 0."
},
Label,
new Button
{
Text = "GC",
AutomationId = "GC",
Command = new Command(o =>
{
GC.Collect();
GC.WaitForPendingFinalizers();
GC.Collect();
Label.Text = "Counter: " + Counter;
})
},
new Button
{
Text = "Push",
AutomationId = "Push",
Command = new Command(async o =>
{
await Navigation.PushAsync(new ContentPage32206());
})
}
}
};
}
protected override void OnAppearing()
{
base.OnAppearing();
if (Label != null)
Label.Text = "Counter: " + Counter;
}
}
[Preserve(AllMembers = true)]
public class ContentPage32206 : ContentPage
{
public ContentPage32206()
{
Interlocked.Increment(ref LandingPage32206.Counter);
System.Diagnostics.Debug.WriteLine("Page: " + LandingPage32206.Counter);
Content = new ListView
{
ItemsSource = new List<string> { "Apple", "Banana", "Cherry" },
ItemTemplate = new DataTemplate(typeof(ViewCell32206)),
AutomationId = "ListView"
};
}
~ContentPage32206()
{
Interlocked.Decrement(ref LandingPage32206.Counter);
System.Diagnostics.Debug.WriteLine("Page: " + LandingPage32206.Counter);
}
}
[Preserve(AllMembers = true)]
public class ViewCell32206 : ViewCell
{
public ViewCell32206()
{
View = new Label();
View.SetBinding(Label.TextProperty, ".");
ContextActions.Add(new MenuItem { Text = "Delete" });
}
}
}