如何在数据库操作正在进行时更新我的 XAML,然后在完成后再次更新它?



我的意图是,当按下按钮时,屏幕上将立即显示活动指示器,然后会发生数据库查询。查询完成后,将创建一个 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 方法。

最新更新