MonoDroid ProgressDialog - PullRequest
       3

MonoDroid ProgressDialog

2 голосов
/ 29 декабря 2011

Все, что я хочу сделать, это убедиться, что пользователь знает, что веб-сервис обрабатывает, чтобы они не нажимали кнопки во время его работы.

        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 () в коде, я никогда не увижу диалоги выполнения. Если я уберу его, я буду видеть прогрессиалог только после того, как веб-сервис вернет его результаты, а затем не отключится, потому что я его нигде не скрывал. Как заставить его отображаться, пока приложение ожидает partValidate и когда я могу его скрыть?

Ответы [ 2 ]

5 голосов
/ 29 декабря 2011

Судя по вашему коду, метод partValidate() выглядит синхронно. Поскольку этот код выполняется в потоке пользовательского интерфейса, пользовательский интерфейс приложения будет заблокирован на время вызова этого метода, что объясняет, почему вы не видите никаких обновлений пользовательского интерфейса до его завершения. Вы можете обойти это, выполнив вызов в фоновом потоке, а затем вернуться к потоку пользовательского интерфейса, как только вам потребуется обновить пользовательский интерфейс:

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 для Android.

0 голосов
/ 29 декабря 2011

Как я понял из вашего вопроса, код в partValidate является асинхронным, но нет параметра для обратного вызова OnComplete.Вы можете решить свою проблему, добавив ее, и ваш код будет выглядеть примерно так:

var isValid = res.partValidate(partnumber.Text,() => {pd.Hide();});

Но лучший способ - создать реализацию класса AsyncTask для вашего вызова веб-службы.Здесь вы можете найти демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...