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

ncgqoxb0  于 2023-04-27  发布在  其他
关注(0)|答案(1)|浏览(101)

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

v2g6jxz6

v2g6jxz61#

很简单:

  • 使方法同步
  • 在异步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);});  
       }     
}

注意如果doLongRunningDatabaseTaskandCreateXAMLasync task类型,那么你根本不需要使用Task.Run方法。

相关问题