Multithreading 如果应用程序在启动过程中关闭,我如何设置主页(或等待主线程)?

Multithreading 如果应用程序在启动过程中关闭,我如何设置主页(或等待主线程)?,multithreading,xamarin.forms,ui-thread,android-runonuithread,Multithreading,Xamarin.forms,Ui Thread,Android Runonuithread,当我的应用程序启动时,会设置一个启动屏幕,它只是一个活动指示器。然后,运行一个任务,启动服务并查找保存的密码。此任务是异步运行的,ActivityIndicator可以旋转。除非在运行此任务时按下home(主页)按钮(Android),否则此操作正常。我知道这是因为如果应用程序关闭,则无法访问主线程。但我不知道如何解决这个问题。我将在下面发布App.xaml.cs public App() { InitializeComponent(); Mai

当我的应用程序启动时,会设置一个启动屏幕,它只是一个
活动指示器
。然后,运行一个任务,启动服务并查找保存的密码。此任务是异步运行的,
ActivityIndicator
可以旋转。除非在运行此任务时按下home(主页)按钮(Android),否则此操作正常。我知道这是因为如果应用程序关闭,则无法访问主线程。但我不知道如何解决这个问题。我将在下面发布App.xaml.cs

    public App()
    {
        InitializeComponent();

        MainPage = new SplashScreen();

        app = this;
    }

    protected override async void OnStart()
    {
        base.OnStart();
        await StartupAsync();
    }

    private async Task StartupAsync()
    {
        ServiceRegistrator.Startup();

        MessagingCenter.Subscribe<NavigationMenuMasterDetailPage>(this, MessagingServiceConstants.LOGOUT, (sender) =>
        {
            Logout();
        });

        var assemblyType = typeof(App).GetTypeInfo();

        AutoFac.Builder.RegisterAssemblyTypes(assemblyType.Assembly)
            .Where(t => t.Name.EndsWith("Service"))
            .AsImplementedInterfaces()
            .SingleInstance();

        _keyChainHelper = AutoFac.Container.Resolve<IKeyChainHelper>();

        TextResources.Culture = DependencyService.Get<ILocalize>().GetCurrentCultureInfo();

        var hasCredentials = HasKeyInChainstore("username") && HasKeyInChainstore("password");

        if (hasCredentials)
        {
            await Task.Run(() =>
            {
                var logonService = AutoFac.Container.Resolve<ILogonService>();
                var username = _keyChainHelper.GetKey("username");
                var password = _keyChainHelper.GetKey("password");
                logonService.Logon(username, password);
            });

            Device.BeginInvokeOnMainThread(() =>
            {
                MainPage = new NavigationMenuMasterDetailPage();
            });
        }
        else
        {
            Device.BeginInvokeOnMainThread(() =>
            {
                ShowLoginPage();
            });
        }
    }
public应用程序()
{
初始化组件();
主页=新的SplashScreen();
app=这个;
}
受保护的重写异步void OnStart()
{
base.OnStart();
等待StartupAsync();
}
专用异步任务StartupAsync()
{
ServiceRegistrator.Startup();
MessagingCenter.Subscribe(此,MessagingServiceConstants.LOGOUT,(发件人)=>
{
注销();
});
var assemblyType=typeof(App).GetTypeInfo();
AutoFac.Builder.RegisterAssemblyTypes(assemblyType.Assembly)
.Where(t=>t.Name.EndsWith(“服务”))
.AsImplementedInterfaces()
.SingleInstance();
_keyChainHelper=AutoFac.Container.Resolve();
TextResources.Culture=DependencyService.Get().GetCurrentCultureInfo();
var hasCredentials=HasKeyInChainstore(“用户名”)和&HasKeyInChainstore(“密码”);
如果(有证书)
{
等待任务。运行(()=>
{
var logonService=AutoFac.Container.Resolve();
var username=_keyChainHelper.GetKey(“用户名”);
var password=_keyChainHelper.GetKey(“密码”);
logonService.Logon(用户名、密码);
});
Device.beginInvokeMainThread(()=>
{
MainPage=新建导航MenuMasterDetailPage();
});
}
其他的
{
Device.beginInvokeMainThread(()=>
{
ShowLoginPage();
});
}
}
我知道必须要做一些事情,要么等待主线程可用,要么强迫应用程序再次打开。确切的异常是“java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作”,这发生在
设备上。BeginInvokeOnMainThread()