我正在用Visual Studio for Mac寫一個非常基本的Xamarin Forms應用程序。 此應用程序應與Android和iOS上的PCL一起使用。xamarin用await /異步形式更新UI
我在XAML文件上有一個空的TableView。我想要做的是填充這個TableView與我將從Web服務中獲取的數據。
這裏是我的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更新嗎? 所以我想知道如果我的代碼是好的。 它看起來很好,因爲它的工作原理,但我想知道這是否是一件好事,這樣工作?
使用'異步/ await'這裏是正確的選擇。當你看到異步調用完成後,UI線程上的await會捕獲當前上下文,並在該上下文中恢復,這使得在調用完成之後更新UI。我建議的一個建議是將'Handle_Clicked'中的代碼分解爲一個項目模板,但與'async'無關。 – JSteward
當主線程等待await指令時,您是否認爲UI是被動的? – Bob5421
@ Bob5421運行代碼並親自查看。 – Servy