1. 程式人生 > >Android——解析非同步訊息處理機制

Android——解析非同步訊息處理機制

Android中的非同步訊息處理主要由四部分組成,Message、Handler、MessageQueue、Looper.

1.Message

Message是執行緒之間傳遞的訊息,它可以在內部攜帶少量的資訊,用於在不同執行緒之間交換資料。Message有what欄位,除此以外,還可以使用arg1和arg2欄位來攜帶一些整型資料,使用obj欄位攜帶一個Object物件。

2.Handler

Handler顧名思義就是處理者的意思,它主要用法傳送訊息和處理訊息。傳送訊息一般使用的是Handler的sendMessage()方法,而發出的資訊經過一系列的輾轉處理之後,最終會傳到Handler的HandleMessage()方法中

3.MessageQueue

MessageQueue是訊息佇列的意思,主要存放通過Handler傳送的訊息,這部分訊息會一直存在於訊息佇列中,等待被處理。每一個執行緒只有一個MessageQueue物件

4.Looper

Looper是每個執行緒中的MessageQueue的管家,呼叫Looper的loop()方法後,就會進入到無限迴圈中,然後每次發現MessageQueue中存在一條訊息,就會將它取出,並傳遞給Handler的handleMessage()方法中,每個執行緒中也只會有一個Looper物件。

public class MainActivity extends Activity implements OnClickListener {
	public static final int UPDATE_TEXT = 1;
	private TextView text;
	private Handler handler = new Handler(){
	public void handleMessage(Message msg){
		switch(msg.what){
			case UPDATE_TEXT:
			//在這裡可以進行ui操作
			text.setText("Nice to meet you");
			break;
			default:
			break;
		}
	 }
<span style="white-space:pre">	</span>}
	public void onClick(View v){
		switch(v.getId()){
		  case R.id.change_text:
     <span style="white-space:pre">		</span>  new Thread(new Runnable() {
			public void run(){
				Message message = new Message();
				message.what = UPDATE_TEXT;
				handler.sendMessage(message); //將message物件傳送出去
			}
                 }).start();
	}
}
非同步訊息處理的整個流程:

首先需要在主執行緒中建立一個Handler物件,並重寫handleMessage()方法。然後當子執行緒中需要進行UI操作時,就會建立一個Message物件,並通過Handler將這條訊息傳送出去(handler.sendMessge(message));之後這條訊息會被新增到MessageQueue的佇列中等待被處理,而Looper則會一直嘗試從MessageQueue中取出待處理的訊息,最後分發回Handler的handleMessage()方法中。由於Handler是在主執行緒中執行,所以是在主執行緒中進行的UI操作。