我正在开发一个不需要后退按钮的Xamarin Forms应用程序(PCL)。该应用程序有三个页面:加载数据的SplashScreenPage、需要登录的LoginPage和MasterDetailPage的RootPage。我想知道在页面之间导航的最佳选择是什么(例如,为了避免内存泄漏):
第一解决方案:
Application.Current.MainPage = new ContentPage();第二个解决方案:
Navigation.PushAsync(new NavigationPage(new ContentPage()));然后
NavigationPage.SetHasNavigationBar(this, false);
ClearNavigationStack();第三解
await Navigation.PushModalAsync(new NavigationPage(new ContentPage()));然后
NavigationPage.SetHasNavigationBar(this, false);
ClearModalStack();发布于 2017-10-26 11:23:41
正如@will-decter所描述的,如果正确实现,上述任何解决方案都不会导致内存泄漏。
您可以使用上述任何一种解决方案。一般来说,你不需要做任何事情来清除上一页。垃圾收集器会自动为您执行此操作(不是立即执行,而是根据某种条件在一段时间后执行)。考虑第一种解决办法:
Application.Current.MainPage = new Page1();现在,如果您指定这样的新页面。
Application.Current.MainPage = new Page2();由于Page1不再使用,当GC试图回收一些内存时,GC将在一段时间后收集Page1对象。您也可以使用GC.Collect()来强制GC立即回收内存,但是由于GC.Collect()操作很昂贵,所以我建议您不要从代码中调用它,而应该优化代码,因此不需要调用它。
但是,如果您的页面订阅的是一个事件,并且没有取消订阅,那么即使调用GC.Collect()方法,GC也无法收集该页面。因此,请确保取消订阅以下任何订阅事件:
public class MainPage : ContentPage
{
protected override void OnAppearing()
{
base.OnAppearing();
MyEntry.TextChanged += MyEntry_TextChanged;
}
protected override void OnDisappearing()
{
base.OnDisappearing();
MyEntry.TextChanged -= MyEntry_TextChanged;
}
}(如果事件是从xaml订阅的,您可以跳过非subscribe,因为在这种情况下,Xamarin表单使用WeakReference)
这将确保在需要时由GC收集MainPage。
我建议阅读这文章,以便更好地了解GC如何在Xamarin中工作,以及如何提高您的应用程序性能。
发布于 2017-10-26 12:53:30
在页面之间导航的最佳选择是
在App.cs中
public App()
{
var nav = new NavigationPage(new Login());
MainPage = nav;
}然后在登录成功上单击:
void OnLoginClicked(object sender, EventArgs e)
{
Application.Current.MainPage = new NavigationPage(new MasterPage());
}不需要添加“NavigationPage.SetHasNavigationBar(此,false)”;
https://stackoverflow.com/questions/46912056
复制相似问题