2016-10-05 46 views
0

我開始我的冒險與移動開發,並已面臨一個問題。我知道在WPF中我會使用BackgroundWorker來更新UI,但它如何與Android一起工作?我發現了很多建議,但這些都不適合我。下面的代碼在執行休息時不會改變文本,它只是等待並一次執行,這不是我想要的。直到方法完成才更新UI。 (Xamarin)

private void Btn_Click(object sender, System.EventArgs e) 
    { 
     RunOnUiThread(() => txt.Text = "Connecting..."); 

     //txt.Text = sql.testConnectionWithResult(); 
     if (sql.testConnection()) 
     { 
      txt.Text = "Connected"; 
      load(); 
     } 
     else 
      txt.Text = "SQL Connection error"; 
    } 
+0

我建議一般來看ReactiveUI,它會幫你解決這個問題,再加上它會強制你使用MVVM而不是在按鈕事件處理程序中編寫邏輯。 –

回答

3

這裏你的行動來自於一個按鈕點擊動作,這樣你就不需要使用RunOnUiThread因爲你準備在這一個工作。

如果我理解正確你的代碼應該是這樣的:

private void Btn_Click(object sender, System.EventArgs e) 
{ 
    txt.Text = "Connecting..."; 

    //do your sql call in a new task 
    Task.Run(() => { 
     if (sql.testConnection()) 
     { 
      //text is part of the UI, so you need to run this code in the UI thread 
      RunOnUiThread((() => txt.Text = "Connected";); 

      load(); 
     } 
     else{ 
      //text is part of the UI, so you need to run this code in the UI thread 
      RunOnUiThread((() => txt.Text = "SQL Connection error";); 
     } 
    }); 

} 

內Task.Run的代碼將被異步調用,而不阻塞UI。 如果您需要在更新UI元素之前等待特定工作,可以使用Task.Run內部的等待詞。

0

有很多方法可以做到這一點,但在你的例子代碼的形式:

button.Click += (object sender, System.EventArgs e) => 
{ 
    Task.Run(async() => 
    { 
     RunOnUiThread(() => txt.Text = "Connecting..."); 
     await Task.Delay(2500); // Simulate SQL Connection time 

     if (sql.testConnection()) 
     { 
      RunOnUiThread(() => txt.Text = "Connected..."); 
      await Task.Delay(2500); // Simulate SQL Load time 
      //load(); 
     } 
     else 
      RunOnUiThread(() => txt.Text = "SQL Connection error"); 
    }); 
}; 

FYI:有一些偉大的圖書館,可以幫助產生反應的用戶體驗,與ReactiveUI存在在我的列表頂部,因爲它是一個MVVM框架...

+0

爲什麼「Task.Run(async()=>」?它不需要,因爲它沒有給「await」帶來好處 – Gabsch

+0

但是有了一個異步事件處理程序(反應式必須支持這個,但我不知道),你不需要。新的任務等待只會在那裏等候,直到Task.Delay回報 – Gabsch

+0

所以這是不可能的 btnAccept.Click + =(對象發件人,發送System.EventArgs)異步()=> { 等待 一些; }? ; – Gabsch

相關問題