Android 单机器人进程对话框

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)

我想做的就是确保用户知道Web服务正在处理,这样他们就不会在它尝试工作时重复地捣乱按钮

        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调用异步在清理代码时肯定很有用,但这意味着该方法的任何客户端也需要异步工作。就个人而言,对于这种情况,我喜欢异步调用,并将委托传递给处理结果的方法。