11 votes

Xamarin Android F# mise à jour de l'interface utilisateur dans un bloc asynchrone

Je suis nouveau sur Xamarin et j'essaie de créer une application Android simple avec F#. J'essaie de charger des données à partir d'une API REST avec asynchronisme, puis de les afficher. Je comprends que l'interaction avec l'interface utilisateur doit se faire sur le MainThread, et qu'il existe quelque chose du genre Activity.RunOnUiThread() . J'ai essayé ce qui suit :

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

Ce qui lève l'exception concernant l'interaction avec les éléments de l'interface utilisateur dans un autre thread. Et ceci :

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

Cela va à l'encontre de l'objectif de l'exécution asynchrone.

Merci

7voto

jzeferino Points 5471

Essayez ça :

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X