我想要做的就是确保用户知道work服务正在处理,这样他们就不会在它试图工作的时候重复地混搭按钮。
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()留在代码中,那么我永远看不到进度对话框。如果我把它取出来,我只能在see服务返回结果后看到进度对话框,然后一直保持不动,因为我没有把它藏在任何地方。如何在应用程序等待partValidate时显示它,以及何时可以隐藏它?
发布于 2011-12-29 06:07:33
从您的代码判断,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上处理这种情况的各种方法。
发布于 2011-12-29 04:58:59
正如我从你的问题中理解的那样,partValidate中的代码是异步的,但是没有OnComplete回调的参数。你可以添加它来解决你的问题,你的代码将会是这样的:
var isValid = res.partValidate(partnumber.Text,() => {pd.Hide();});但更好的方法是为您的web服务调用创建AsyncTask类的实现。在这里你可以找到demo
https://stackoverflow.com/questions/8661142
复制相似问题