2011-12-28 62 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(),那么我从来没有看到进度对话框。如果我拿出来,我只能看到webservice返回结果后进度对话框,然后保持原状,因为我没有将它隐藏在任何地方。如何在应用程序等待partValidate时显示它,以及何时可以隐藏它?

回答

5

从您的代码判断,它看起来像partValidate()方法是同步的。由于此代码正在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解释处理的各种方法:当你需要更新用户界面,你可以解决这个问题通过在后台线程上运行的呼叫,然后搬回到UI线程在Mono上针对Android应用程序的这种情况。

+0

似乎要做的伎俩。谢谢!!尽管我的webmethod是异步的,还是这样或者更高效? – jmease 2011-12-28 22:17:02

+0

我想说,更关键的是哪种方法最适合你在做什么,而不是效率。使Web调用异步可以清理代码,但这意味着该方法的任何客户端都需要异步工作。就个人而言,对于这种情况,我喜欢异步调用,并将委托传递给处理结果的方法。 – 2011-12-28 22:23:10

0

正如我从你的问题代码partValidate的理解是异步的,但没有OnComplete回调参数。你能解决你的问题将它和你的代码将是这样的:

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

但更好的方法是创建实现AsyncTask类为您的Web服务调用。 在这里您可以找到demo

+0

似乎问题更多的是什么时候progressdialog显示比什么都重要。它不会出现在partValidate运行之后。我已经添加了我的完整代码,以防万一有一些明显的缺失。 – jmease 2011-12-28 21:52:16