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操作。