2017-09-15 17 views
0

上の非同期タスクを実行します。アプリケーションの起動時に私は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(); 
} 
+0

あなたは「より良いアプローチ」で何を探していますか?読み込み中のページを劣悪なユーザーエクスペリエンスとして表示することを検討する理由は何ですか? –

+0

アプリケーションのロードに5〜8秒かかると、読み込みページはOKです。ユーザーに何かが起こっていることが示されます(進行中の移行など)。私は時間を測定し、アプリケーションを起動するのに7秒かかる(Samsung Galaxy A5)。 – broadband

答えて

0

別の方法は、あなたがタスクのリストに同時に実行したい項目のそれぞれを追加して待つことであろうすべてのために。その後、すべての項目が非同期に実行されますが、CheckUserの結果は引き続き取得できます。あなたが使ったものよりも良いかどうかはわかりませんが、別の方法です。それ以外の場合は、各機能を待機しているときに同時に実行されていません。

protected async Task OnStart() 
    { 
     Page startPage = null; 
     //create a list of the items you want to run concurrently 
     List<Task> list = new List<Task>(); 
     list.Add(App.Database.Migrations()); 
     list.Add(CheckUser()); 
     //wait for all of them to complete 
     Task.WaitAll(list.ToArray()); 

     //get the result from the CheckUser call 
     Task<bool> checkUsertask = list[1] as Task<bool>; 
     if (checkUsertask.Result == true) 
      this.MainPage = new Layout.BrowsePage(); 
     else 
      this.MainPage = new LoginPage(); 
    } 

リストを気に入らない場合は、[1]、その後、あなたはそれを一度完全に参照できるように、リストに追加する前に1つのタスクを作成することができます。

protected async Task OnStart() 
{ 
    Page startPage = null; 
    //create a list of the items you want to run concurrently 
    List<Task> list = new List<Task>(); 
    list.Add(App.Database.Migrations()); 
    var checkUserTask = CheckUser(); 
    //create this task directly so we can refer to it later to get the result 
    list.Add(checkUserTask); 
    //wait for all of them to complete 
    Task.WaitAll(list.ToArray()); 

    //get the result from the CheckUser call 
    if (checkUserTask.Result == true) 
     this.MainPage = new Layout.BrowsePage(); 
    else 
     this.MainPage = new LoginPage(); 
} 
+0

OPは必要に応じてデータベースを更新し、そこからユーザー情報を取得します。 2つは同時に実行できません。一方は他方に依存します。 –

1

さて、あなただけのAppコンストラクタにすべてを置くことができ、あなたがアプリをロードしながら、スプラッシュスクリーンだけで、より長く表示されますが、私は実際にこれが劣るソリューションであると信じています。

スプラッシュスクリーンを使用すると、スプラッシュスクリーンとまったく同じですが、プログレスバーや読み込みアイコンが表示され、ユーザーに何をしているかを伝える読み込みページがはるかに良い方法です。

ユーザーが最初のページを表示する前にこれを行う必要がある場合は、ローディング画面を使用すると、その理由をユーザーに知らせることができます。

私が追加する唯一のもう一つの点は、すでにロードされているデータベースのブール値またはバージョン番号を保存することです。そのため、アプリケーションバージョンが増加しない限り、その移行コードを実行する必要はありません。

これを行うことで、このブールチェックをアプリケーションコンストラクタに配置し、最初のページをすぐに読み込むことができます。移行が必要な場合は、読み込みページを読み込み、OnStartで移行を完了させてから、最初のアプリ画面を読み込みます。

関連する問題