Индикатор активности не отображается на странице xaml в xamarin.forms?

У меня есть индикатор активности на странице xaml. Первоначально его свойство IsVisible имеет значение false. У меня есть кнопка на странице. Когда пользователь нажимает кнопку, он вызывает веб-службу для получения данных. Я изменяю значение свойства IsVisible на true перед вызовом службы, чтобы индикатор активности начал отображаться на странице, а после успешного вызова службы я снова меняю его значение на false, чтобы оно больше не отображалось на странице.

Но это не работает. Я знаю настоящую проблему. Когда мы вызываем веб-службу, поток пользовательского интерфейса блокируется и не показывает индикатор активности. Как я могу включить поток пользовательского интерфейса при вызове веб-службы, чтобы индикатор активности мог отображаться на странице, пока мы не получим данные?


person anand    schedule 15.02.2016    source источник


Ответы (2)


Попробуйте сделать вызов вашего веб-сервиса async и await.

В зависимости от того, как вы структурировали вещи, вам, возможно, придется использовать TaskCompletionSource, как показано в следующем примере.

В этом примере, когда кнопка нажата, она становится невидимой, а для ActivityIndicator устанавливается значение IsRunning=True, чтобы показать ее.

Затем он выполняет вашу длительную задачу / веб-сервис в функции ExecuteSomeLongTask, используя TaskCompletionSource.

Причина этого в том, что в нашем коде нажатия кнопки у нас есть последние строки: -

              objActivityIndicator1.IsRunning = false;
              objButton1.IsVisible = true;

Это остановит запуск и отображение ActivityIndicator, а также также вернет кнопку в видимое состояние.

Если бы мы не использовали TaskCompletionSource, эти строки выполнялись бы сразу после вызова ExecuteSomeLongTask, если это был обычный асинхронный метод / функция, и в результате ActivityIndicator не запущен, а кнопка все еще быть видимым.

Пример: -

        Grid objGrid = new Grid()
        {
        };

        ActivityIndicator objActivityIndicator1 = new ActivityIndicator();
        objGrid.Children.Add(objActivityIndicator1);

        Button objButton1 = new Button();
        objButton1.Text = "Execute webservice call.";
        objButton1.Clicked += (async (o2, e2) =>
          {
              objButton1.IsVisible = false;
              objActivityIndicator1.IsRunning = true;
              //
              bool blnResult = await ExecuteSomeLongTask();
              //
              objActivityIndicator1.IsRunning = false;
              objButton1.IsVisible = true;
          });
        objGrid.Children.Add(objButton1);

        return objGrid;

Вспомогательная функция: -

    private Task<bool> ExecuteSomeLongTask()
    {
        TaskCompletionSource<bool> objTaskCompletionSource1 = new TaskCompletionSource<bool>();
        //
        Xamarin.Forms.Device.StartTimer(new TimeSpan(0, 0, 5), new Func<bool>(() =>
        {
            objTaskCompletionSource1.SetResult(true);
            //
            return false;
        }));
        //
       return objTaskCompletionSource1.Task;
    }
person Pete    schedule 15.02.2016

Вам нужно выполнять свою работу асинхронно. Или другими словами: используйте Asnyc & Await, чтобы убедиться, что ваш пользовательский интерфейс хорошо работает во время звонка.

Дополнительную информацию можно найти в документации Xamarin.

async и await - это новые функции языка C #, которые работают вместе с библиотекой параллельных задач, чтобы упростить написание многопоточного кода для выполнения длительных задач без блокировки основного потока вашего приложения.

Если вам нужна дополнительная помощь, обновите свой вопрос и опубликуйте свой код или то, что вы пробовали до сих пор.

person Joehl    schedule 15.02.2016