天天看點

android異步消息處理機制Android異步資訊處理機制

Android異步資訊處理機制

我們都知道android的ui更新操作都是在主線程執行的,但是很多時候我們都需要在子線程

中執行一些費時的操作,以擷取我們所需要的變更資料。很多剛入門的同學都容易犯的一個錯誤就是在子線程試圖去更新Ui控件,這樣做是被android禁止的,是以會出現崩潰的現象。

Android的異步資訊處理機制就是專門解決這個問題而誕生的。對于這個異步機制我們隻需要知道四個對象即可,即Message,Handler,Looper,MessageQueue。它們的功能分别如下:

Message:故名思意就是消息,這個消息是可以攜帶對象的,我們可以通過message.what制定目前操作的類型,通過message.obj指定對象。

Handler:我們一般初始化的方法如下:

      Handlerhandler = newHandler() {

                    public voidhandleMessage(android.os.Message msg) {

                           Objectobj=msg.obj;//一般儲存要傳遞的對象

                           Intwhat=msg.what;//擷取到需要操作的類型

                           Switch(what)

                           {

                                  case0:break;//執行對應的操作

                                  case1:break;

                           }

                    };

             };

當我們需要發送消息時,可以這樣:

Message msg=new Message();

Msg.obj=new object();

Handler.sendMessge(msg);

整個消息的傳遞過程稍後解釋。

MessageQueue:是一個消息隊列,這裡邊存放了很多message,它們是以隊列的方式排列的。消息會一個一個排在這裡邊。

Looper:就像是一個管家,他負責把messageQUeue裡邊的message一個一個取出來,并傳遞給handler,調用handleMessage方法,就實作了一個消息的異步傳遞。

整個過程是這樣的。在子線程中執行完資料的擷取操作,就給handler發送消息,此時,這個message會在messageQueue裡邊排隊,Looper 檢測到有message就會取出來,喚醒handle的handlerMessage方法,然後在這個方法裡邊就實作ui重新整理。整個過程就成功的從一個子線程發送一個信号到主線程,然後主線程實作ui更新。