首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Application.Current.MainPage vs Navigation.PushAsync()与Navigation.PushModalAsync()

Application.Current.MainPage vs Navigation.PushAsync()与Navigation.PushModalAsync()
EN

Stack Overflow用户
提问于 2017-10-24 13:39:34
回答 2查看 14.9K关注 0票数 4

我正在开发一个不需要后退按钮的Xamarin Forms应用程序(PCL)。该应用程序有三个页面:加载数据的SplashScreenPage、需要登录的LoginPageMasterDetailPageRootPage。我想知道在页面之间导航的最佳选择是什么(例如,为了避免内存泄漏):

第一解决方案:

代码语言:javascript
复制
Application.Current.MainPage = new ContentPage();

第二个解决方案:

代码语言:javascript
复制
Navigation.PushAsync(new NavigationPage(new ContentPage()));

然后

代码语言:javascript
复制
NavigationPage.SetHasNavigationBar(this, false);
ClearNavigationStack();

第三解

代码语言:javascript
复制
await Navigation.PushModalAsync(new NavigationPage(new ContentPage()));

然后

代码语言:javascript
复制
NavigationPage.SetHasNavigationBar(this, false);
ClearModalStack();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-10-26 11:23:41

正如@will-decter所描述的,如果正确实现,上述任何解决方案都不会导致内存泄漏。

您可以使用上述任何一种解决方案。一般来说,你不需要做任何事情来清除上一页。垃圾收集器会自动为您执行此操作(不是立即执行,而是根据某种条件在一段时间后执行)。考虑第一种解决办法:

代码语言:javascript
复制
Application.Current.MainPage = new Page1();

现在,如果您指定这样的新页面。

代码语言:javascript
复制
Application.Current.MainPage = new Page2();

由于Page1不再使用,当GC试图回收一些内存时,GC将在一段时间后收集Page1对象。您也可以使用GC.Collect()来强制GC立即回收内存,但是由于GC.Collect()操作很昂贵,所以我建议您不要从代码中调用它,而应该优化代码,因此不需要调用它。

但是,如果您的页面订阅的是一个事件,并且没有取消订阅,那么即使调用GC.Collect()方法,GC也无法收集该页面。因此,请确保取消订阅以下任何订阅事件:

代码语言:javascript
复制
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中工作,以及如何提高您的应用程序性能。

做法/

票数 6
EN

Stack Overflow用户

发布于 2017-10-26 12:53:30

在页面之间导航的最佳选择是

在App.cs中

代码语言:javascript
复制
public App()
{
    var nav = new NavigationPage(new Login());
    MainPage = nav;
}

然后在登录成功上单击:

代码语言:javascript
复制
void OnLoginClicked(object sender, EventArgs e)
{
    Application.Current.MainPage = new NavigationPage(new MasterPage());
}

不需要添加“NavigationPage.SetHasNavigationBar(此,false)”;

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46912056

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档