2016-06-10 4 views
11

Ich bin neu in Xamarin, und versuche, eine einfache Android-App mit F # zu bauen. Ich versuche, Daten aus einer REST-API mit Async zu laden und dann anzuzeigen. Ich verstehe, dass die Interaktion mit der Benutzeroberfläche auf dem MainThread erfolgen muss, und dass es etwas in Richtung Activity.RunOnUiThread() gibt. Ich habe folgendes versucht:Xamarin Android F # Update UI in async Block

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 

Das wirft die Ausnahme über die Interaktion mit den UI-Elementen in einem anderen Thread. Und dieses:

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

dem Zweck es Async

Dank tun

+2

Versuchen 'tun setzen! Async.SwitchToContext Application.SynchronizationContext in Ihrem asynchronen Block vor dem Update von 'searchResults.Text'. – ildjarn

Antwort

7

Versuchen Sie folgendes:

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