首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MonoDroid ProgressDialog

MonoDroid ProgressDialog
EN

Stack Overflow用户
提问于 2011-12-29 04:48:39
回答 2查看 3.1K关注 0票数 2

我想要做的就是确保用户知道work服务正在处理,这样他们就不会在它试图工作的时候重复地混搭按钮。

代码语言:javascript
复制
        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时显示它,以及何时可以隐藏它?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-29 06:07:33

从您的代码判断,partValidate()方法看起来是同步的。由于这段代码是在UI线程上执行的,因此应用程序的UI将在该方法调用期间被阻塞,这就解释了为什么在它完成之前看不到任何UI更新。您可以通过在后台线程上运行调用,然后在需要更新UI时移回UI线程来解决此问题:

代码语言:javascript
复制
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上处理这种情况的各种方法。

票数 5
EN

Stack Overflow用户

发布于 2011-12-29 04:58:59

正如我从你的问题中理解的那样,partValidate中的代码是异步的,但是没有OnComplete回调的参数。你可以添加它来解决你的问题,你的代码将会是这样的:

代码语言:javascript
复制
var isValid = res.partValidate(partnumber.Text,() => {pd.Hide();});

但更好的方法是为您的web服务调用创建AsyncTask类的实现。在这里你可以找到demo

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8661142

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档