上の非同期タスクを実行します。アプリケーションの起動時に私はXamarinを使用して次を実行したいスタートアップ
スプラッシュスクリーンがすぐに示されている(私はこの次の次のチュートリアルhttps://channel9.msdn.com/Blogs/MVP-Windows-Dev/Using-Splash-Screen-with-Xamarin-Formsを達成した)
- を
デシベル移行を実行します(ユーザがアプリケーションを更新して初めて実行する場合)
ユーザデータ(ユーザ名とパスワード)をdbから読み込み、REST Webサービスを呼び出してユーザデータが有効かどうかを確認します。ユーザデータがメインページには、有効なリダイレクトユーザーであればそうでない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();
を実行すると、実行を一時停止し、タスクの完了を待つのを待ちます。一方、LoadApplication()は実行を継続し、App.MainPageが今までに設定されていると見なします)。私のの仮定は正しくですか?私は非常に非同期に新しい/私と一緒に裸を待っています。私はちょうど3つの画面が表示されているので、LoadingPage
を避けたい
:(アプリが起動され、右)
- スプラッシュ画面
- LoadingPage(デシベルの移行、httpリクエスト、...)
- BrowsePageかログインページ
ユーザーエクスペリエンスのために2ページにするのが望ましいです。
私はこのように終わったが、私はより良いアプローチがあると信じている:
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秒かかると、読み込みページはOKです。ユーザーに何かが起こっていることが示されます(進行中の移行など)。私は時間を測定し、アプリケーションを起動するのに7秒かかる(Samsung Galaxy A5)。 – broadband