【问题标题】:correct way to load data async in xamarin forms在 xamarin 表单中异步加载数据的正确方法
【发布时间】:2018-09-24 22:31:34
【问题描述】:

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

我有一个 xamarin forms projekt,其中包含一个地图组件。 我想在获取用户当前位置(来自 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 双向设置为异步,并且正确绑定

有什么不同吗?

【问题讨论】:

    标签: xamarin.forms async-await


    【解决方案1】:

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

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

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

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

    【讨论】:

    • 嗨尼克!感谢您的回答。好的,这清楚地说明了我应该如何使用它。我有一个关于最后一部分的问题。 (任务。运行()...)。我以为我的 UI 线程是在等待时释放的(我已经通过循环 50 次来验证它(以延长获取我的地图图钉的时间,并且可以看到地图在图钉出现之前几秒钟加载))。你是说“await MyLengthyGet()”不足以释放 UI 线程?
    • 我还没有看到你的 GetPinsFromServer 实现,但通常只要你在整个方法中一直使用异步等待,而不是在任何地方使用 .Result.Wait通常很好。我使用Task.Run 的意思是您的方法听起来可能是一项长时间运行的任务,在这种情况下,您可能会考虑使用CancellationToken 在后台运行它,因为异步等待本身不一定会创建一个新线程并且您可能希望根据用户的操作来停止任务。
    • 是的,我一直使用异步等待,没有结果。我想我必须阅读差异...感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-25
    • 2018-01-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多