2017-09-26 25 views
0

XamarinとC#を使ってアンドロイドアプリをビルドしています。 アプリはrestsharpを使用して自分のサーバーに接続し、必要な情報を引き出します。Xamarin - async/awaitとProgressDialogの使用

私は登録ページを作成しようとしています。ユーザーが存在するかどうかを確認したいと思います。 ユーザーがProgressDialogを見ている間、これをバックグラウンドで実行したいと思います。

  if (!string.IsNullOrEmpty(PhoneNumber) && !string.IsNullOrEmpty(Password) 
      && !string.IsNullOrEmpty(LicenceId) && LicenceImage.Length > 1) 
     { 
      ProgressDialog mDialog = new ProgressDialog(this); 
      mDialog.SetMessage("Loading data..."); 
      mDialog.SetCancelable(false); 
      mDialog.Show(); 

      bool checkExistance = await api.CheckIfExist(PhoneNumber); 

      if (checkExistance) 
      { 
       Android.Support.V7.App.AlertDialog.Builder alert = new Android.Support.V7.App.AlertDialog.Builder(this); 
       alert.SetTitle(""); 
      } 
      else 
      { 
       Intent intent = new Intent(this, typeof(RegisterDone)); 

       StartActivity(intent); 
      } 

     } 

ProgressDialogショーが、何もhappednsより:

は、これは私のコードです。 私は他の方法でそれをやろうとしましたが、それでもまだ仕事をしていました。

これを行うにはどのような方法がありますか? Thxを事前に

+0

それは新しいスレッドを作成し、UIスレッドにする必要がありますダイアログを変更するよう、非同期の用心。 – rmjoia

+0

'api.CheckIfExist(PhoneNumber);'が実行されているかどうかを確認するためにブレークポイントを使ってみましたか? –

+0

はい、thiaメソッドが実行され、boolが返されます。問題は、サーバーが結果を返す後に何も起こらないということです。 –

答えて

0

私はユーザーが存在するかどうかをチェックしたいと思います。ユーザーがProgressDialogを見ている間にこれを実行したい

Handlerを使用してこの機能を実装することができます。 ProgressDialogと表示すると、Handler新しいスレッドを開いて検証を実行できます。結果が得られたら、HandlerHandlerクラスにメッセージを送って、結果を得てロジックを実行することができます。次に例を示します。

ProgressDialogを表示し、Handlerが検証を実行するための新しいスレッドを開いて使用します。

mDialog = new ProgressDialog(this); 
mDialog.SetMessage("Loading data..."); 
mDialog.SetCancelable(false); 
mDialog.Show(); 

Action action =() => 
{ 
    checkExistance(); 
}; 

handler = new MyHandler(this); 
handler.Post(action); 

チェックユーザーがMyHandlerにメッセージを送って、存在し、値を返す場合:

private async void checkExistance() 
{ 
    bool checkExistance = api.CheckIfExist(PhoneNumber); 

    Message msg = new Message(); 
    msg = handler.ObtainMessage(); 

    if (checkExistance) 
    { 
     msg.Arg1 = 0;//tell MyHandler exist 
    } 
    else 
    { 
     msg.Arg1 = 1;//tell MyHandler didnt exist 
    } 
    handler.SendMessage(msg); 
} 
MyHandler

ハンドルメッセージ:

public class MyHandler : Handler 
{ 
    private MainActivity mainActivity; 

    public MyHandler(MainActivity mainActivity) 
    { 
     this.mainActivity = mainActivity; 
    } 

    public override void HandleMessage(Message msg) 
    { 
     switch (msg.Arg1) 
     { 
      case 0: 
       //true 
       mainActivity.Exist(); 
       mainActivity.mDialog.Dismiss(); 
       break; 
      case 1: 
       //false 
       mainActivity.Regist(); 
       mainActivity.mDialog.Dismiss(); 
       break; 
      default: 
       break; 
     } 
     base.HandleMessage(msg); 
    } 
} 

Exist()方法とMainActivityRegist()

public void Exist() 
{ 
    Android.Support.V7.App.AlertDialog.Builder alert = new Android.Support.V7.App.AlertDialog.Builder(this); 
    alert.SetTitle(""); 
} 

public void Regist() 
{ 
    Intent intent = new Intent(this, typeof(RegisterDone)); 
    StartActivity(intent); 
} 

効果:

enter image description here

関連する問題