正确的方式以Xamarin形式加载数据异步

时间:2018-09-24 09:14:00

标签: xamarin.forms async-await

正确加载异步数据的正确方法是什么,以便能够尽快向用户显示UI。例如

我有一个xamarin表单项目,其中包含一个地图组件。 我想先显示地图,然后再获取用户的当前位置(来自gps)以及从服务器获取的一些位置/管脚。我已经看到了这两种方法

1)从构造函数中调用异步方法

   Map mMyMap;
   ctor()
   {
       InitializeCompeont();
       InitAsync();
   }
   private async void InitAsync()
   { 
      var pins = await GetPinsFromServer();
      mMyMap.Pins.Add(pins)
   }

2)在出现中

 ctor()
  {
   InitalizeComponent()
  }
  protected override async void OnAppearing()
  { 
      var pins = await GetPinsFromServer();
       mMyMap.Pins.Add(pins)
   }

这两种方法似乎都是“有效的”,但是我愚弄了自己从构造函数中调用异步方法的想法?

我也设法通过两种方式设置BindingContext异步,并且绑定正确

有什么区别吗?

1 个答案:

答案 0 :(得分:2)

加载时间和调用数据的时间有所不同。如果在页面ctor中完成,它将在第一次创建该页面时被调用一次,并且仅被调用一次。

如果在OnAppearing中完成,则调用将在显示页面之前进行,并且可以多次调用。例如,如果将另一个页面推到该页面的顶部然后将其弹出,将再次调用OnAppearing以重新加载数据,如果该其他页面修改了前一页中显示的数据,则可以这样做。否则,您可能会进行不必要的加载数据调用。

值得注意的是,OnAppearingOnDisappearing并非总是在不同平台上同时一致地被调用。例如,如果您在Android或iOS上使用内置共享,则一个事件可能会触发这两个事件,而另一个事件可能根本不会触发任何事件。

此外,我将确保您使用Task.Run();在后​​台线程上运行所有长时间运行的任务,以确保您没有锁定主线程,并可能将bool设置为在必要时显示/隐藏微调框,以了解后台任务的开始和结束时间。