2016-06-10 13 views
11

Jestem nowy w Xamarin i próbuję zbudować prostą aplikację na Androida z F #. Próbuję wczytać dane z interfejsu API REST z asynchronizacją, a następnie wyświetlić. Rozumiem, że interakcja z interfejsem użytkownika musi odbywać się na MainThread i że istnieje coś podobnego do linii Activity.RunOnUiThread(). Próbowałem następujące:Xamarin Android F # aktualizacja interfejsu użytkownika w async bloku

let onSearch args = 
     let search = this.FindViewById<EditText>(Resource_Id.search) 
     let searchResults = this.FindViewById<TextView>(Resource_Id.searchResults) 

     button.Text <- search.Text 
     async { 
      let! results = recipeSearch.GetRecipes search.Text 
      searchResults.Text <- results 
     } 
     |> Async.Start 

    button.Click.Add onSearch 

Który wyrzuca wyjątek o interakcji z elementami interfejsu użytkownika w innym wątku. I tak:

let result = async { 
        let! results = recipeSearch.GetRecipes search.Text 
        return results 
       } 
       |> Async.RunSynchronously 
    searchResults.Text <- result 

celowość prowadzenia go asynchroniczny

Dzięki

+2

Spróbuj umieścić 'zrobić! Async.SwitchToContext Application.SynchronizationContext' w twoim async bloku przed aktualizacją 'searchResults.Text'. – ildjarn

Odpowiedz

7

Spróbuj tego:

let onSearch args = 
     let search = this.FindViewById<EditText>(Resource_Id.search) 
     let searchResults = this.FindViewById<TextView>(Resource_Id.searchResults) 

     button.Text <- search.Text 
     async { 
      let! results = recipeSearch.GetRecipes search.Text 
      this.RunOnUiThread(fun() -> searchResults.Text <- results) 
     } 
     |> Async.Start 

    button.Click.Add onSearch