应用在同一UI线程中启动之前的等待方法

时间:2019-01-16 10:24:28

标签: xamarin.forms async-await task

我正在尝试检查应该从哪个页面开始加载我的应用程序,首先,我在检查数据库表时是否找到了存储的登录信息,所以我想在工作时推送一次名为StartPage()的信息。与数据库一起使用时,如果没有要存储的任何数据,该方法将等待我要推送的LoginPage()。我已尝试遵循此示例Xamarin.Forms Async Task On Startup。我的代码是:

public App()
    {

        int result;
        InitializeComponent();

        ThreadHelper.Init(SynchronizationContext.Current);
        ThreadHelper.RunOnUIThread(async () => {
            MainPage = new ActivityIndicatorPage();
            result = await InitializeAppAsync();
            if (result == 0)
            {
                PushLoginPage();
            }
            else
            {
                PushStartPage();
            }
        });



    }
 public void PushStartPage()
    {
        NavigationPage nav = new NavigationPage(new StartPage());
        nav.SetValue(NavigationPage.BarBackgroundColorProperty, Color.FromHex("#D60000"));
        MainPage = nav;
    }

    public void PushLoginPage()
    {
        MainPage = new Login();
    }

    public void PushLoginPage(string email, string password)
    {
        MainPage = new Login(email, password);
    }

    private async Task<int> InitializeAppAsync()
    {
        if (ViewModel == null)
            ViewModel = new MainViewModel(this);

        return  await ViewModel.LoginViewModel.PushInitialPage();


    }

但是会引发以下异常,并且不建议这样做。 Exception 尝试的另一种方法是覆盖OnStart()方法,但也不起作用。

protected override async void OnStart()
    {
        Task.Run(async ()=> { await InitializeAppAsync(); });
    }

PushInitialPage方法:     公共异步任务PushInitialPage()         {

        if (_app.Properties.ContainsKey("isLogged"))
        {
            var user = await UserDataBase.GetUserDataAsync();

            var result = await Login(user.Email, user.Password);


            if (result.StatusCode != 200)
            {
                return 0;
                ///PushLoginPage();
            }
            else
            {
                return 1;
                //PushStartPage();
            }

        }
        else
        {

            return 0;
        }
    }

2 个答案:

答案 0 :(得分:0)

在Xamarin.Forms中,我们具有称为“ Application.Current.Properties”的属性。通过使用它,我们可以保存任何数据类型。因此,一旦用户登录到应用程序,您就可以设置一个标志并将其设置为true。然后,每次用户登录到应用程序后,您都可以检查该标志并浏览各自的页面。

示例代码:

App.cs:

public App()
{
 if (Current.Properties.ContainsKey("isLogged"))
 {
    if((bool)Application.Current.Properties["isLogged"])
    {
       // navigate to your required page.
    }
    else
    {
      // naviate to login page.
    }
 }
 else
 {
   // naviate to login page.
 }
}

在第一次打开应用程序时,它将检查是否显示'isLogged'属性,如果不存在,它将移至登录页面。当用户使用其凭据登录到应用程序时,我们需要创建'isLoggin'属性并将其设置为true。然后,如果用户尝试登录,它将检查条件并导航到相应页面。

保存属性SampleCode:

Application.Current.Properties["isLogged"] = true;

await Application.Current.SavePropertiesAsync();

在登录到应用程序后为上面的代码编写代码。如果用户从应用程序注销,则需要将'isLogged'标志设置为false。

答案 1 :(得分:0)

当操作系统要求您的应用显示页面时,它必须显示一个页面。它不能说“等一两分钟,当我通过虚弱的网络连接与该远程服务器通信时”。它必须立即显示一个页面。

因此,我建议您打开一个初始页面-例如您的公司或应用程序徽标。当显示初始页面时,然后调用InitializeAppAsync,并根据结果切换到登录页面或开始页面或用户友好的脱机错误页面。