我的意图是,当按下按钮时,屏幕上将立即显示活动指示器,然后会发生数据库查询。查询完成后,将创建一个 XAML 网格,将删除活动指示器并添加新的 XAML 网格。在实践中,这一切都有效,但通常活动指示器不会显示,所以我想知道我是否编码错误。
我有一个按钮,导致 UpdateDetails 方法触发:
private async Task UpdateDetails()
{
details.Children.Clear();
details.Children.Add(Helpers.Activity.Create());
var newGrid = doLongRunningDatabaseTaskandCreateXAML();
details.Children.Clear();
details.Children.Add(Helpers.Activity.Create(newGrid);
}
如何使活动指示器首先显示,直到数据库操作完成,然后显示 newGrid?请注意,最重要的是在数据库操作和 newGrid 创建正在进行时显示活动指示器。
嗯,很简单:
-
使方法同步
在 异步
Task.Run
中添加不需要的 UI 线程代码Task.Run(async () => { //Your piece of code }
现在,当您要更新 UI 时,只需使用以下方法以
MainThread
编写该部分代码Device.BeginInvokeOnMainThread(() => { //UI updation });
更新
您的代码应如下所示:
private async Task UpdateDetails()
{
Task.Run(async () =>
{
Device.BeginInvokeOnMainThread(() => { details.Children.Clear();
details.Children.Add(Helpers.Activity.Create());});
var newGrid = await doLongRunningDatabaseTaskandCreateXAML();
Device.BeginInvokeOnMainThread(() => { details.Children.Clear();
details.Children.Add(Helpers.Activity.Create(newGrid);});
}
}
请注意,如果doLongRunningDatabaseTaskandCreateXAML
属于async task
类型,则根本不需要使用 Task.Run
方法。