【发布时间】:2019-08-22 09:10:15
【问题描述】:
我正在开发一个 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();
}
}
【问题讨论】:
标签: c# android ios multithreading xamarin