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更新。