Android 单机器人进程对话框
我想做的就是确保用户知道Web服务正在处理,这样他们就不会在它尝试工作时重复地捣乱按钮Android 单机器人进程对话框,android,xamarin.android,Android,Xamarin.android,我想做的就是确保用户知道Web服务正在处理,这样他们就不会在它尝试工作时重复地捣乱按钮 EditText partnumber = (EditText)FindViewById(Resource.Id.itemNumber); partnumber.FocusChange += (object sender, View.FocusChangeEventArgs e) => { if (!e.HasFocus)
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。如果我把它取出来,我只会在Web服务返回结果后看到progressdialog,然后保持不动,因为我没有把它隐藏在任何地方。当应用程序等待partValidate时,如何让它显示出来?何时可以隐藏它?正如我从partValidate中的问题代码中了解到的那样,partValidate是异步的,但没有用于OnComplete回调的参数。您可以通过添加它来解决问题,您的代码如下所示:
var isValid = res.partValidate(partnumber.Text,() => {pd.Hide();});
但更好的方法是为web服务调用创建AsyncTask
类的实现。
在这里您可以找到从您的代码判断,
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;
}
}
}
}
};
我有一篇博文,解释了在Mono for Android应用程序上处理这种情况的各种方法。似乎问题更多的是当progressdialog显示时。只有在partValidate运行之后才会显示。我已经添加了我的完整代码,以防我明显遗漏了什么。似乎做到了这一点。谢谢但是,我的webmethod是异步的还是更高效的呢?我想说的更多的是哪种方法对您所做的事情最有意义,而不是效率。使web调用异步在清理代码时肯定很有用,但这意味着该方法的任何客户端也需要异步工作。就个人而言,对于这种情况,我喜欢异步调用,并将委托传递给处理结果的方法。