標籤:實現 obj 嵌套 roi extends fun tools 對象 androi
對於Android的Message機制主要涉及到三個主要的類,分別是Handler、Message、Looper;首先對每個類做一個簡單介紹;然後再介紹所謂的Android的Message機制是如何?的,最後給了一個樣本。
一、介紹三個相關的類
1、 Handler主要有兩個用途:首先是可以定時處理或者分發訊息,其次是可以添加一個執行的行為在其它線程中執行,
對於Handler中的方法,可以選擇你關心的操作去覆蓋它,處理具體的業務操作,常見的就是對訊息的處理可以覆蓋public voidhandleMessage(參數)方法,可以根據參數選擇對此訊息是否需要做出處理,這個和具體的參數有關。例如下代碼:
[java] view plain copy print?
- Handler mHandler = new Handler() {
- @Override public void handleMessage(Message msg) {//覆蓋handleMessage方法
- switch (msg.what) {//根據收到的訊息的what類型處理
- case BUMP_MSG:
- Log.v("handler", "Handler===="+msg.arg1);//列印收到的訊息
- break;
- default:
- super.handleMessage(msg);//這裡最好對不需要或者不關心的訊息拋給父類,避免丟失訊息
- break;
- }
- }
- };
2、 訊息android.os.Message
android.os.Message是定義一個Messge包含必要的描述和屬性資料,並且此對象可以被發送給android.os.Handler處理。屬性欄位:arg1、arg2、what、obj、replyTo等;其中arg1和arg2是用來存放整型資料的;what是用來儲存訊息標示的;obj是Object類型的任意對象;replyTo是訊息管理器,會關聯到一個handler,handler就是處理其中的訊息。通常對Message對象不是直接new出來的,只要調用handler中的obtainMessage方法來直接獲得Message對象。
3、 Looper類主要用於一個線程迴圈擷取訊息佇列中的訊息。
Looper的作用主要是負責管理訊息佇列,負責訊息的出列和入列操作。
二、Android的Message機制是如何??
1、為什麼要使用Message機制主要是為了保證線程之間操作安全,同時不需要關心具體的訊息接收者,使訊息本身和線程剝離開,這樣就可以方便的實現定時、非同步等操作。
2、Message機制原理:
Activity <---------------> EHandler<-----> Looper<-----> MessageQueue
IntentReceiver <-----> EHandler <-----> Looper<-----> MessageQueue
圖 1
3、 如何??(具體描述的訊息流程的過程)
實現Message機制需要Handler、Message、Looper三個之間的互相作用來實現;當線程A需要發訊息給線程B的時候,線程B要用自己的Looper執行個體化Handler類,就是構造handler對象時,把當前線程的Looper傳給Handler建構函式,handler本身會儲存對Looper的引用,handler構造好以後,就可以用handler的obtainMessage方法執行個體化Message對象,只要把要傳的資料給Handler,Handler就會構造Message對象,並且把Message對象添加到訊息佇列裡面。然後就可以調用handler的sendMessage方法把Message對象發送出去,Looper就把訊息放到訊息佇列中;最後當Looper知道訊息佇列不為空白時候,就會迴圈的從訊息佇列中取訊息,取出訊息就會調用剛才執行個體化好的Handler對象的handleMessage方法取處理訊息,整個Message過程就是這樣。(1所示)
三、下面介紹一個關於Message機制的簡單的樣本,具體的代碼如下:
1、 下面是一個新起的一個線程發訊息的樣本
handler本身不僅可以發送訊息,還可以用post的方式添加一個實現Runnable介面的匿名對象到訊息佇列中,在目標收到訊息後就可以回調的方式在自己的線程中執行run的方法體,這就是handler兩種典型的使用方式!
[java] view plain copy print?
- class NoLooperThread extends Thread {
- private EventHandler mNoLooperThreadHandler;
- public void run() {
- Looper myLooper, mainLooper;
- myLooper= Looper.myLooper(); //獲得自己的Looper
- mainLooper= Looper.getMainLooper(); //獲得自己的main的looper
- String obj;
- if (myLooper == null) {
- mNoLooperThreadHandler = new EventHandler(mainLooper);
- obj= "NoLooperThread has no looper andhandleMessage function executed in main thread!";
- }else
- {
- mNoLooperThreadHandler = new EventHandler(myLooper);
- obj= "This is from NoLooperThread self andhandleMessage function executed in NoLooperThread!";
- }
- mNoLooperThreadHandler.removeMessages(0); //清空訊息佇列
- if (false == postRunnable) {
- Message m = mNoLooperThreadHandler.obtainMessage(2, 1, 1, obj); //產生訊息對象
- mNoLooperThreadHandler.sendMessage(m); //發送訊息
- Log.e(sTag, "NoLooperThread id:" + this.getId());
- }else {
- mNoLooperThreadHandler.post(new Runnable() { //添加一個Runnable介面的實現到訊息佇列,此Runnable介面的實現不在此 線程中執行,會在接收的線程中執行。
- public void run() {
- tv.setText("update UI through handler post runnalbe mechanism!");
- noLooerThread.stop();
- }
- });
- }
- }
2、下面是一個定時迴圈發訊息的樣本,如下代碼:
詳細的解釋參考代碼的注釋
Handler handler = new Handler() { //建立處理對象handler
publicvoid handleMessage(Message msg) {
switch (msg.what) {
caseMES: {
final int N = mCallbacks.beginBroadcast(); //Copy一份回調list,並且標記一個狀態
for (int i = 0; i <N; i++) {
try {
mCallbacks.getBroadcastItem(i).getValue(mMediaPlayer01.getCurrentPosition()); //遍曆所有回調介面 }catch (Exception e) {
e.printStackTrace();
}
}
mCallbacks.finishBroadcast(); //完成後狀態複位
sendMessageDelayed(obtainMessage(MES),1 * 1000);
}
break;
default:
super.handleMessage(msg);
}
}
};
NOTE: 整個hadleMessage方法相當一個嵌套的迴圈
四、總結:
所謂的訊息機制其實很簡單,實現這種機制需要只需要四步:
1、執行個體化Looper(因為執行個體化Handler時需要一個looper);
2、執行個體化Handler,這裡需要覆蓋handleMessage方法,處理收到的訊息;
3、 執行個體化Message對象,調用已經執行個體化好的handler對象的obtainMessage方法,把資料傳給obtainMessage方法,obtainMessage方法就會執行個體化一個Message對象。(這裡也可以發送實現Runnable介面的對象);
4、調用Handler的sendMessage方法把執行個體化好的Message對象發送出去。
對每個線程過程都是一樣的,只要按照上面的四個步驟來就可以發送和接收訊息了。
Android的Message機制