2016-06-10 24 views
11

Sono nuovo di Xamarin e sto provando a creare una semplice app per Android con F #. Sto cercando di caricare i dati da un'API REST con async e quindi visualizzarli. Capisco che l'interazione con l'interfaccia utente debba essere eseguita sul MainThread e che ci sia qualcosa sulla falsariga di Activity.RunOnUiThread(). Ho provato quanto segue:Xamarin Android F # update UI nel blocco asincrono

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 

che genera l'eccezione di interagire con gli elementi dell'interfaccia utente in un altro thread. E questo:

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

sconfigge lo scopo di farlo Async

Grazie

+2

Prova a mettere 'fare! Async.SwitchToContext Application.SynchronizationContext' nel tuo blocco asincrono prima di aggiornare 'searchResults.Text'. – ildjarn

risposta

7

Prova questo:

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