加载图像前关闭活动指示器

时间:2018-07-02 22:22:33

标签: c# xamarin xamarin.forms activity-indicator

我有一个问题。在我的图像从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 :(得分:1)

我不在电脑旁,在此设备上操作很棘手,但是这里...

选项1:BackgroundWorker

异步/等待不会使其在后台线程上运行,您需要在后台线程上进行加载。请注意,Tasks and threads are different

在您的班级上创建一个字段,输入BackgroundWorker。将该字段的DoWork事件连接为包含以下内容的方法:

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

这些行曾经是哪里,请在您的字段上调用RunWorkerAsync。您可以将query的值放入字段中,以便可以从DoWork方法中使用它。

选项2:实际线程

将3行放入称为Load(string query)的方法中。这些行曾经在哪里,执行以下操作:

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

我认为myNewThread必须是一个字段,这样它才不会被垃圾收集。

答案 1 :(得分:0)

使用以下方法实现您的方法

Device.BeginInvokeOnMainThread(async () =>
{
   //load your images here
   //Lastly set IsBusy to false
});