執行異步任務,我想執行下一次使用Xamarin:上啓動
當應用程序啓動時啓動畫面立即呈現(我已經達到了這個以下一個教程https://channel9.msdn.com/Blogs/MVP-Windows-Dev/Using-Splash-Screen-with-Xamarin-Forms)
執行數據庫遷移如果有(用戶更新的應用程序,並在第一次運行)
從數據庫中讀取用戶數據(用戶名和密碼),調用REST webservice來檢查用戶數據是否仍然有效。如果用戶的數據是有效的將用戶重定向到炫魅否則重定向到LoginPage
我讀過關於未來良好Xamarin.Forms Async Task On Startup後。當前代碼:
public class MainActivity :global::Xamarin.Forms.Platform.Android.FormsApplicationActivity
{
protected override void OnCreate (Bundle bundle)
{
base.OnCreate (bundle);
global::Xamarin.Forms.Forms.Init (this, bundle);
LoadApplication (new App()); // method is new in 1.3
}
}
// shared code - PCL lib for Android and iOS
public partial class App : Application
{
public App()
{
InitializeComponent();
// MainPage = new LoadingPage();
}
}
protected override async void OnStart()
{
// Handle when your app starts
await App.Database.Migrations();
if(await CheckUser()) // reads user data from db and makes http request
this.MainPage = new Layout.BrowsePage();
else
this.MainPage = new LoginPage();
}
如果MainPage
在構造異常未設置被套上iOS和Android。我知道異步void不會等待,如果它不明確地有.Wait()
- Async void,但這是否意味着執行線程仍然繼續它的工作。
執行線程命中時await App.Database.Migrations();
它暫停執行並等待等待Task完成。同時它繼續它的工作(即LoadApplication()繼續執行,並期望現在設置App.MainPage)。我的假設是否正確?對於異步/等待我來說,我很新。
我只是想避免LoadingPage
因爲三分屏顯示:
- 閃屏(權當應用程序被啓動)
- LoadingPage(DB遷移,HTTP請求,..)
- BrowsePage或LoginPage
對於用戶體驗而言,理想的只是兩頁。
我弄成這個樣子,但我相信有一個更好的方法:
protected override void OnStart()
{
Page startPage = null;
Task.Run(async() =>
{
await App.Database.Migrations();
startPage = await CheckUser() ? new Layout.BrowsePage() : new LoginPage();
}.Wait();
this.MainPage = startPage();
}
你在'更好的方法'中尋找什麼?爲什麼你認爲顯示一個加載頁面是一個劣質的用戶體驗? –
我想,如果應用程序需要5-8秒加載然後加載頁面就可以了。它向用戶顯示正在發生的事情(正在進行遷移......)。我測量了時間,啓動應用程序需要7秒(Samsung Galaxy A5)。 – broadband