2017-06-19 4 views
0

Ich schreibe eine sehr einfache Xamarin Forms Application, mit Visual Studio für Mac. Diese Anwendung sollte mit PCL auf Android und iOS funktionieren.Xamarin Formulare Update UI mit erwarten/async

Ich habe eine leere TableView auf XAML-Datei. Was ich tun möchte ist, diese TableView mit Daten zu füllen, die ich von einem Webservice abholen werde.

Hier ist mein C# -Code:

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); 
    } 
} 

: Ich bin zu warten und Asynchron-Programmierung. Früher habe ich native iOS-Anwendungen mit iOS-Delegierten entwickelt. Ich habe gehört, dass ein Thread die Benutzeroberfläche nicht aktualisieren kann: Kann ich in der LoadData() -Methode beispielsweise einige UI-Aktualisierungen vornehmen? Also frage ich mich, ob mein Code gut ist. Es sieht gut aus, weil es funktioniert, aber ich möchte wissen, ob das eine gute Sache ist, so zu arbeiten?

+0

Mit 'async/await' hier ist die richtige Wahl. 'await' auf dem UI-Thread erfasst den aktuellen Kontext und wird in diesem Kontext fortgesetzt, wenn der asynchrone Aufruf abgeschlossen wird. Dadurch wird die Aktualisierung der UI nach dem Ende des Aufrufs, wie Sie sehen, beendet. Ein Vorschlag, den ich machen würde, ist, den Code in 'Handle_Clicked' in eine Elementvorlage zu zerlegen, aber das hat nichts mit' async' zu tun. – JSteward

+0

Glaubst du, dass die Benutzeroberfläche reaktiv ist, wenn der Haupt-Thread auf einen Wartebefehl wartet? – Bob5421

+0

@ Bob5421 Führen Sie den Code und sehen Sie selbst. – Servy

Antwort

-2
private void UpdateUI(Action action) 
{ 
    this.Invoke(new Action(action), null); 
} 

Verwendung: UpdateUI (() => lable1.Text = "Aktualisiert");

+0

Dieser Code ist nicht gültig in Xamarin Forms, vielleicht haben Sie WinForms und IsInvokeRequired gedacht? – JSteward

+0

Meinst du, wenn ich UI-Steuerelemente innerhalb der asynchronen Methode aktualisiere, muss ich mit diesem Invoke-Aufruf arbeiten? – Bob5421

+0

@ Bob5421 Nein, das tust du nicht. – Servy

0

Ich glaube, seine

Device.BeginInvokeOnMainThread(() => 
{ 

}); 
Verwandte Themen