1. 程式人生 > 其它 >不在UI主執行緒下實現更新的方法

不在UI主執行緒下實現更新的方法

技術標籤: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();
});