【问题标题】:xamarin forms update UI with await/asyncxamarin 表单使用等待/异步更新 UI
【发布时间】:2017-11-22 03:06:33
【问题描述】:

我正在使用 Visual Studio for Mac 编写一个非常基本的 Xamarin Forms 应用程序。 此应用程序应适用于 Android 和 iOS 上的 PCL。

我在 XAML 文件上有一个空的 TableView。我想要做的是用我将从网络服务获取的数据填充这个 TableView。

这是我的 C# 代码:

HttpClient client = new HttpClient();

public async Task<List<MyItem>> LoadData()
{
    try
    {
        var response = await client.GetAsync(new Uri("http://example.com/myservice.php"));
        if (response.IsSuccessStatusCode)
        {
            var content = await response.Content.ReadAsStringAsync();
            return JsonConvert.DeserializeObject<List<MyItem>>(content);
        }
    }
    catch (Exception)
    {
        return null;
    }

    return null;
}

async void Handle_Clicked(object sender, System.EventArgs e)
{
    activity_indicator.IsRunning = true;
    var data = await LoadData();
    activity_indicator.IsRunning = false;

    mylistview.Root.Clear();
    foreach (var item in data)
    {
        TableSection section = new TableSection() { Title = item.GroupTitle };
        foreach (var subitem in item.subitems)
        {
            var cell = new TextCell() { Text = subitem.Title };
            cell.Tapped += on_item_tapped;
            section.Add(cell);
        }
        mylistview.Root.Add(section);
    }
}

我是等待和异步编程的新手。我曾经使用 iOS 代理开发原生 iOS 应用程序。我听说线​​程无法更新 UI:例如,我可以在 LoadData() 方法中进行一些 UI 更新吗? 所以我想知道我的代码是否很好。 它看起来不错,因为它可以工作,但我想知道这样工作是否是一件好事?

【问题讨论】:

  • 在这里使用async/await 是正确的选择。 UI 线程上的await 将捕获当前上下文并在异步调用完成时在该上下文上恢复,这使得调用完成后更新 ui 变得微不足道,如您所见。我提出的一个建议是将Handle_Clicked 中的代码分解到项目模板中,但这与async 无关。
  • 当主线程等待等待指令时,你认为 UI 是响应式的吗?
  • @Bob5421 运行代码,自己看看。
  • 我只在模拟器中尝试过,它似乎是被动的
  • @Bob5421 然后就可以了。

标签: c# xamarin xamarin.ios xamarin.forms async-await


【解决方案1】:

我相信它

Device.BeginInvokeOnMainThread(() =>
{

});

【讨论】:

    【解决方案2】:
    private void UpdateUI(Action action)
    {
         this.Invoke(new Action(action), null);
     }
    

    用法:UpdateUI(()=> lable1.Text="Updated");

    【讨论】:

    • 这段代码在 Xamarin Forms 中无效,也许你在想 WinForms 和 IsInvokeRequired?
    • 你的意思是如果我在异步方法中更新 UI 控件,我需要使用这个 Invoke 调用吗?
    • @Bob5421 不,你没有。
    • @JSteward 如果这一个winforms应用程序,没有理由使用InvokeRequired,虽然这不是一个winforms应用程序,所以它没有实际意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-08-15
    • 1970-01-01
    • 2018-02-24
    • 1970-01-01
    • 2014-08-08
    • 1970-01-01
    • 2013-10-12
    相关资源
    最近更新 更多