我有一个问题。在我的图像从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;
}
}
谢谢!
答案 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
});