Индикатор активности закрывается до загрузки изображений - PullRequest
0 голосов
/ 03 июля 2018

У меня есть вопрос. Индикатор моей активности закрывается до того, как мои изображения будут загружены из моего API. Это потому, что вызов API является асинхронным? Если это так, как я могу убедиться, что звонок выполнен или изображения загружены на экран, прежде чем отключить индикатор активности?

Код индикатора активности в моем XAML выглядит следующим образом:

  <ActivityIndicator IsRunning="{Binding IsBusy}"
                             IsVisible="{Binding IsBusy}"
                             VerticalOptions="Center"
                             HorizontalOptions="Center"/>

Моя собственность (которая находится в базе viewmodel):

private bool isBusy;
        public bool IsBusy
        {
            get { return isBusy; }
            set { SetProperty(ref isBusy, value); }
        }

И это код, в котором я установил свойство:

  public override async void OnNavigatingTo(NavigationParameters navParams)
        {
            if(navParams.ContainsKey("query"))
            {
                var query = (string)navParams["query"];
                IsBusy = true;
                await DisplayImages(query);
                IsBusy = false;

            }
        }

Спасибо!

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Реализуйте в своем методе, используя:

Device.BeginInvokeOnMainThread(async () =>
{
   //load your images here
   //Lastly set IsBusy to false
});
0 голосов
/ 03 июля 2018

Я не за компьютером, и это сложно сделать на этом устройстве, но здесь идет ...

Вариант 1: BackgroundWorker

Async / await не запускает его в фоновом потоке, загрузка должна выполняться в фоновом потоке. И помните, что Задачи и темы разные .

Создайте поле в своем классе, введите BackgroundWorker. Подключите событие DoWork этого поля, чтобы оно было методом, содержащим:

            IsBusy = true;
            DisplayImages(query);
            IsBusy = false;

А там, где раньше были эти строки, позвоните RunWorkerAsync на свое поле. Вы можете поместить значение query в поле, чтобы его можно было использовать из метода DoWork.

Вариант 2: фактическая резьба

Поместите 3 строки в метод с именем Load(string query). Там, где раньше были эти строки, сделайте это:

myNewThread = new Thread(() => Load(query));
myNewThread.Start();

Я думаю, myNewThread должно быть полем, чтобы не собирать мусор.

...