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

时间:2016-11-24 08:00:36

标签: multithreading xamarin.forms ui-thread android-runonuithread

启动我的应用后,会设置一个只有ActivityIndicator的启动画面。然后,运行启动服务并查找已保存密码的任务。此任务以异步方式运行,因此ActivityIndicator可以旋转。除非在此任务运行时按下主页按钮(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();
            });
        }
    }

我知道必须要做的事情要么等待主线程可用,要么强制应用再次打开。确切的异常是“java.lang.IllegalStateException:在onSaveInstanceState之后无法执行此操作”,这发生在Device.BeginInvokeOnMainThread()

0 个答案:

没有答案