MonoDroid ProgressDialog

时间:2011-12-28 20:48:39

标签: android xamarin.android

我想要做的就是确保用户知道网络服务正在处理,这样他们就不会在尝试工作时反复混搭按钮。

        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时显示它以及何时可以隐藏它?

2 个答案:

答案 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