2011-12-28 8 views
2

私がやりたいことは、Webサービスが処理中であることを知っていることを確認して、動作しようとしている間に繰り返しボタンをマッシュしないようにすることです。MonoDroid ProgressDialog

 EditText partnumber = (EditText)FindViewById(Resource.Id.itemNumber); 
     partnumber.FocusChange += (object sender, View.FocusChangeEventArgs e) => 
     { 
      if (!e.HasFocus) 
      { 
       var pd = ProgressDialog.Show(this, "Processing", "Please Wait...", false); 
       var res = new InventoryApp(); 
       res.partValidateCompleted += delegate { pd.Hide(); }; 
       var isValid = res.partValidate(partnumber.Text); 
       if (isValid == "Not Found") 
       { 
        partnumber.Text = ""; 
        partnumber.RequestFocus(); 
        partqty.ClearFocus(); 
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.SetTitle("Invalid Part"); 
        builder.SetMessage("Part number does not exist in database. Please ensure you are entering the correct part number and try again"); 
        builder.SetPositiveButton("OK", delegate { }); 
        var dialog = builder.Create(); 
        dialog.Show(); 
       } 
       else 
       { 
        partdesc.Text = isValid; 
       } 
      } 
     }; 

コードにpd.Hide()を残しても、progressdialogは表示されません。私がそれを取り出すと、ウェブサービスが結果を返した後で進捗状況ダイアグラムが表示され、どこにでも隠していないので、そのままになります。アプリケーションがpartValidateを待っている間にどのように表示させるのですか?そしていつ隠すことができますか?

答えて

5

あなたのコードから判断すると、それはpartValidate()の方法が同期的であるように見えます。このコードはUIスレッド上で実行されているため、そのメソッド呼び出しの間UIのブロックが行われるため、終了するまでUI更新が表示されない理由を説明します。あなたは、バックグラウンドスレッド上で呼び出しを実行することでこれを回避して、あなたはUIを更新する必要が一度UIスレッドに戻って移動することができます:

partnumber.FocusChange += (object sender, View.FocusChangeEventArgs e) => 
{ 
    if (!e.HasFocus) 
    { 
     var pd = ProgressDialog.Show(this, "Processing", "Please Wait...", false); 
     var res = new InventoryApp(); 
     res.partValidateCompleted += delegate { pd.Hide(); }; 

     ThreadPool.QueueUserWorkItem(state => 
     { 
      var isValid = res.partValidate(partnumber.Text); 

      RunOnUiThread(() => 
      { 
       if (isValid == "Not Found") 
       { 
        partnumber.Text = ""; 
        partnumber.RequestFocus(); 
        partqty.ClearFocus(); 
        AlertDialog.Builder builder = new AlertDialog.Builder(this); 
        builder.SetTitle("Invalid Part"); 
        builder.SetMessage("Part number does not exist in database. Please ensure you are entering the correct part number and try again"); 
        builder.SetPositiveButton("OK", delegate { }); 
        var dialog = builder.Create(); 
        dialog.Show(); 
       } 
       else 
       { 
        partdesc.Text = isValid; 
       } 
      } 
     } 
    } 
}; 

私は取引のさまざまな方法を説明してブログアップ投稿hereを持っていますMono for Androidアプリケーションのこのシナリオを使用します。

+0

トリックをするようです。ありがとう!!私のwebmethodが非同期である方が良いでしょうか、それともこれは効率的ですか? – jmease

+0

私は、どちらの方法が効率の1つではなく、あなたがやっていることに対して最も理にかなっているかどうかという問題があると思います。 Web呼び出しを非同期にすることは、コードをクリーンアップする上では間違いありませんが、そのメソッドのクライアントは非同期でも動作する必要があります。個人的には、このような場合、私は非同期に呼び出しを行い、結果を処理するためのメソッドにデリゲートを渡すのが好きです。 –

0

私はpartValidateのあなたの質問から理解したように、非同期ですが、OnCompleteコールバックのパラメータはありません。あなたはそれを追加し、あなたの問題を解決することができますし、あなたのコードは次のようなものになります。

var isValid = res.partValidate(partnumber.Text,() => {pd.Hide();}); 

しかし、より良い方法は、あなたのWebサービス呼び出しのためのAsyncTaskクラスの実装を作成することです。 ここにあなたが見つかりますdemo

+0

progressdialogが何よりも表示されているときは、問題のようです。 partValidateが実行されるまで表示されません。私は完全なコードを追加しました。私には明らかなものがあります。 – jmease