我想要做的就是确保用户知道网络服务正在处理,这样他们就不会在尝试工作时反复混搭按钮。
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。如果我把它拿出来,我只会在webservice返回结果之后看到progressdialog,然后保持原状,因为我没有将它隐藏在任何地方。如何在应用程序等待partValidate时显示它以及何时可以隐藏它?
答案 0 :(得分: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应用程序中处理这种情况的各种方法。
答案 1 :(得分:0)
正如我从你的问题中所理解的,partValidate中的代码是异步的,但OnComplete回调没有参数。您可以解决添加它的问题,您的代码将是这样的:
var isValid = res.partValidate(partnumber.Text,() => {pd.Hide();});
但更好的方法是为您的Web服务调用创建AsyncTask
类的实现。
在这里,您可以找到demo