应用启动时MainPage无法正常加载,切换后台后恢复的问题求助
应用启动时MainPage无法正常加载,仅后台切换后才显示
我编写了LoadMainPage方法,用于根据用户登录、注册状态跳转对应页面,并在App.Xaml.cs的OnStart方法中调用该方法。但应用启动时主页面无法正常显示,只有点击手机多任务图标切换到后台再重新进入才会出现。
LoadMainPage方法代码
public async Task LoadMainPage() { try { signedin = Auth.IsUserSignedIn(); if (signedin) registered = await Firestore.IsUserRegistered(); if (!signedin) { MainPage = new NavigationPage(new MainPage()); } else if (signedin && !(registered)) { MainPage = new NavigationPage(new RegistrationPage()); } else if (signedin && (registered)) { MainPage = new NavigationPage(new FlyoutPage1()); } } catch (Exception ex) { await App.Current.MainPage.DisplayAlert("Error", ex.Message, "OK"); } }
OnStart调用代码
protected override async void OnStart() { base.OnStart(); await LoadMainPage(); }
Firestore.IsUserRegistered方法代码
public async Task<bool> IsUserRegistered() { FirebaseFirestore collection = FirebaseFirestore.Instance; string email = FirebaseAuth.Instance.CurrentUser.Email; Android.Gms.Tasks.Task task = collection.Collection("User").WhereEqualTo("Email", email) .Limit(1).Get().AddOnSuccessListener(this); for (int i = 0; i < 25; i++) { await Task.Delay(100); if (isregistered ) break; } return isregistered; } public void OnSuccess(Java.Lang.Object result) { var documents = (QuerySnapshot)result; isregistered = !documents.IsEmpty; }
问题原因及修复方案
核心问题
- 异步生命周期方法调用导致UI更新滞后:
OnStart为异步void方法,异步操作的执行时机可能晚于UI初始化完成的时间,导致主页面设置未被及时渲染。 - Firestore查询实现低效且存在线程同步问题:通过循环轮询等待
isregistered变量,不仅浪费资源,还可能因线程可见性问题导致变量更新不及时,影响页面跳转逻辑。
修复步骤
1. 优化Firestore查询的异步实现
放弃轮询等待,直接将Android原生Task转换为.NET可await的Task,确保查询完成后再返回结果:
public async Task<bool> IsUserRegistered() { FirebaseFirestore db = FirebaseFirestore.Instance; string email = FirebaseAuth.Instance.CurrentUser.Email; // 将Android Task转换为.NET可await的Task var querySnapshot = await Tasks.WhenAll( db.Collection("User").WhereEqualTo("Email", email).Limit(1).Get() ); return !querySnapshot[0].IsEmpty; }
2. 确保主页面设置在UI线程执行
显式切换到UI线程更新主页面,避免异步操作导致的UI渲染延迟:
public async Task LoadMainPage() { try { signedin = Auth.IsUserSignedIn(); bool registered = false; if (signedin) registered = await Firestore.IsUserRegistered(); // 强制在UI线程更新主页面 Device.BeginInvokeOnMainThread(() => { if (!signedin) { MainPage = new NavigationPage(new MainPage()); } else if (!registered) { MainPage = new NavigationPage(new RegistrationPage()); } else { MainPage = new NavigationPage(new FlyoutPage1()); } }); } catch (Exception ex) { Device.BeginInvokeOnMainThread(() => { MainPage?.DisplayAlert("Error", ex.Message, "OK"); }); } }
3. 添加启动临时页面(可选)
在App构造函数中先设置一个加载页,避免启动时出现空白:
public App() { InitializeComponent(); // 先设置临时加载页,提升用户体验 MainPage = new NavigationPage(new LoadingPage()); }
内容的提问来源于stack exchange,提问作者Asgar Ali
相关产品推荐
相关产品推荐

