2016-06-10 17 views
11

Tôi mới dùng Xamarin và đang cố gắng xây dựng một ứng dụng Android đơn giản với F #. Tôi đang cố gắng tải dữ liệu từ một API REST với async, và sau đó hiển thị nó. Tôi hiểu rằng việc tương tác với giao diện người dùng phải được thực hiện trên MainThread và có điều gì đó nằm dọc theo các dòng Activity.RunOnUiThread(). Tôi đã thử các cách sau:Xamarin Android F # cập nhật giao diện người dùng trong khối không đồng bộ

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 

Điều này sẽ loại trừ Ngoại lệ về tương tác với các thành phần giao diện người dùng trong một chuỗi khác. Và đây:

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

Thất bại mục đích làm việc đó Async

Cảm ơn

+2

Hãy thử đặt 'làm! Async.SwitchToContext Application.SynchronizationContext' trong khối async của bạn trước khi cập nhật 'searchResults.Text'. – ildjarn

Trả lời

7

Hãy thử điều này:

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 
Các vấn đề liên quan