不在UI主執行緒下實現更新的方法
阿新 • • 發佈:2021-01-17
技術標籤:Android
一、使用Activity類的RunOnUiThread 方法。
當更新操作位於Activity下時使用RunOnUiThread方式。
示例:
RunOnUiThread(() =>
{
tv.Text = text;
});
採用c# 5.0 的新特性await實現非同步操作中可以不使用RunOnUiThread,暫不建議使用。
示例:
public async void LoadXamarin() { //測試用 string url = "http://www.xamarin-cn.com/test.json"; //建立一個請求 var httpReq = (HttpWebRequest)HttpWebRequest.Create(new Uri(url)); var httpRes = (HttpWebResponse)await httpReq.GetResponseAsync(); if (httpRes.StatusCode == HttpStatusCode.OK) { var text = new StreamReader(httpRes.GetResponseStream()).ReadToEnd(); tv.Text = text; } }
二、使用Android.OS名稱空間下的Handler 類。
Handler永遠都是在UI主執行緒,這就意味著對一個控制元件的修改永遠只會有一個執行緒,不會存在多個執行緒同時修改一個控制元件。
服務沒有RunOnUIThread 方法,在服務中可使用Handler實現相同效果,有以下兩種方式。
一種是handler.sendMessage,發一個訊息,再根據訊息,執行相關任務程式碼。
另一種是handler.post(r),r是要執行的任務程式碼。意思就是說r的程式碼實際是在UI執行緒執行的,可以寫更新UI的程式碼。
示例:
varmyHandler = new Handler (); myHandler.Post(() => { Toast.MakeText (this, "Message from demo service", ToastLength.Long).Show(); });