【发布时间】: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