我正在开发一个 Xamarin Forms 应用程序,我想在其中启动时执行一些操作。我想调用的方法的一部分负责检查是否满足某些条件,如果没有,我想显示一个警报(使用 DisplayAlert 方法)来通知用户他/她应该采取的操作,以便正确执行执行应用程序功能。不幸的是,在 Android 上,警报不会显示,它并不总是发生,有时会显示,但在大多数情况下不会显示。经过一些研究后,我认为该问题可能与线程有关。我添加了一些断点,我注意到在 Android 上,负责显示警报的代码行在页面变得可见之前被执行。在 iOS 上,一切正常(当显示大约一半的 UI 时,就会显示警报)。我尝试从主线程执行所有内容。在 Android 上它有部分帮助,警报在更多情况下正确显示,尽管我仍然没有达到 100% 的准确性。此外,在 iOS 上,提到的更改导致应用程序卡在启动屏幕上。下面是我尝试使用的代码的两个版本。
首先是我开始的基本代码:
public partial class App : Application
{
MainPage mainPage;
public static string DatabaseLocation = string.Empty;
public App(string databaseLocation)
{
//All of the UI code is written in C# in MainPage initializer
mainPage = new MainPage();
MainPage = new NavigationPage(mainPage);
DatabaseLocation = databaseLocation;
}
protected override async void OnStart()
{
base.OnStart();
//in DoThings there is a code containing DisplayAlert
await mainPage.DoThings();
}
}
下面是我尝试将所有内容都放在主线程上的代码版本:
public partial class App : Application
{
MainPage mainPage;
public static string DatabaseLocation = string.Empty;
public App(string databaseLocation)
{
Device.BeginInvokeOnMainThread(() =>
{
mainPage = new MainPage();
MainPage = new NavigationPage(mainPage);
});
DatabaseLocation = databaseLocation;
}
protected override async void OnStart()
{
base.OnStart();
Device.BeginInvokeOnMainThread(async () =>
await mainPage.DoThings());
}
}
我还尝试从主线程运行专门负责显示警报的代码行,但它也没有帮助。DoThings 是 MainPage 中的一个方法。
public async Task DoThings() {
if (somethingMissing()){
Device.BeginInvokeOnMainThread(async () =>
await DisplayAlert("Error", "Fix errors", "Ok"));
}
else
{
DoStuff();
}
}
梵蒂冈之花
相关分类