现在的位置: 首页 > 综合 > 正文

Android的Message机制(简单小结)

2013年01月09日 ⁄ 综合 ⁄ 共 5166字 ⁄ 字号 评论关闭

AndroidMessage机制(简单小结)

对于AndroidMessage机制主要涉及到三个主要的类,分别是HandlerMessageLooper;首先对每个类做一个简单介绍;然后再介绍所谓的AndroidMessage机制是如何实现的,最后给了一个示例。

一、介绍三个相关的类

1、 Handler主要有两个用途:首先是可以定时处理或者分发消息,其次是可以添加一个执行的行为在其它线程中执行,

对于Handler中的方法,可以选择你关心的操作去覆盖它,处理具体的业务操作,常见的就是对消息的处理可以覆盖public void
handleMessage(参数)方法,可以根据参数选择对此消息是否需要做出处理,这个和具体的参数有关。例如下代码:

Handler mHandler =
new Handler() {

@Overridepublicvoid handleMessage(Message msg) {//覆盖handleMessage方法

switch (msg.what) {//根据收到的消息的what类型处理

caseBUMP_MSG:

Log.v("handler",
"Handler===="+msg.arg1);//打印收到的消息

break;

default:

super.handleMessage(msg);//这里最好对不需要或者不关心的消息抛给父类,避免丢失消息

}

}

};

2、 消息android.os.Message

android.os.Message是定义一个Messge包含必要的描述和属性数据,并且此对象可以被发送给android.os.Handler处理。

属性字段arg1arg2whatobjreplyTo等;其中arg1arg2是用来存放整型数据的;what是用来保存消息标示的;objObject类型的任意对象;replyTo是消息管理器,会关联到一个handlerhandler就是处理其中的消息。

通常对Message对象不是直接new出来的,只要调用handler中的obtainMessage方法来直接获得Message对象。

3、 Looper类主要用于一个线程循环获取消息队列中的消息。

Looper的作用主要是负责管理消息队列,负责消息的出列和入列操作。

二、AndroidMessage机制是如何实现?

1、为什么要使用Message机制主要是为了保证线程之间操作安全,同时不需要关心具体的消息接收者,使消息本身和线程剥离开,这样就可以方便的实现定时、异步等操作。

         2Message机制原理示意图:

                  

  

   

消息队列

      

 

 

 

 

 

                               
1

4、 如何实现?(具体描述上图的消息流的过程)

实现Message机制需要HandlerMessageLooper三个之间的互相作用来实现;当线程A需要发消息给线程B的时候,线程B要用自己的Looper实例化Handler类,就是构造handler对象时,把当前线程的Looper传给Handler构造函数,handler本身会保存对Looper的引用,handler构造好以后,就可以用handlerobtainMessage方法实例化Message对象,只要把要传的数据给HandlerHandler就会构造Message对象,并且把Message对象添加到消息队列里面。然后就可以调用handlersendMessage方法把Message对象发送出去,Looper就把消息放到消息队列中;最后当Looper知道消息队列不为空时候,就会循环的从消息队列中取消息,取出消息就会调用刚才实例化好的Handler对象的handleMessage方法取处理消息,整个Message过程就是这样。(如图1所示)

三、下面介绍一个关于Message机制的简单的示例,具体的代码如下:

1、 下面是一个新起的一个线程发消息的示例

handler本身不仅可以发送消息,还可以用post的方式添加一个实现Runnable接口的匿名对象到消息队列中,在目标收到消息后就可以回调的方式在自己的线程中执行run的方法体,这就是handler两种典型的使用方式!

  

   

获得自己的looper

              class NoLooperThread
extends Thread {

  

   

获得自己的mainlooper

                     private EventHandler
mNoLooperThreadHandler;

                     publicvoid run() {

                     LoopermyLooper, mainLooper;

  

   

清空消息队列

                     myLooper= Looper.myLooper();

                     mainLooper= Looper.getMainLooper();

                     Stringobj;

                     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) {

                            Messagem =
mNoLooperThreadHandler
.obtainMessage(2, 1, 1, obj);

                            mNoLooperThreadHandler.sendMessage(m);

  

   

添加一个Runnable接口的实现到消息队列,此Runnable接口的实现不在此线程中执行,会在接收的线程中执行。

                            Log.e(sTag,
"NoLooperThread id:" +
this.getId());

  

   

Runnable的具体实现

                     }else {

                            mNoLooperThreadHandler.post(new Runnable() {

                                   publicvoid run() {

                                          tv.setText("update UI through handler post runnalbemechanism!");

                                          noLooerThread.stop();

                                   }

                            });

                     }

              }

2、 下面是一个定时循环发消息的示例,如下代码:

详细的解释参考代码的注释

  

   

创建处理对象handler

Handler handler =
new Handler() {

                    
@Override

  

   

覆盖handleMessge方法,处理相应消息

                     publicvoid handleMessage(Message msg) {

  

   

采用系统的RemoteCallBackList来处理回调接口的典型做法

                    

                           
switch
(msg.what) {

                           
case
MES: {

  

   

Copy一份回调list,并且标记一个状态

                                   final
int N = mCallbacks.beginBroadcast();

                                  
for (int i = 0; i < N;i++) {

                                  
       try {

                                  
              mCallbacks.getBroadcastItem(i).getValue(mMediaPlayer01.getCurrentPosition());                                                 }
catch (Exception e) {

  

   

遍历所有回调接口

                                                 //
TODO Auto-generated catch block

                                         
       e.printStackTrace();

                                  
              }

  

   

完成后状态复位

                                   }

  

   

整个hadleMessage方法相当一个嵌套的循环,可以在处理完消息后继续发一个定时的消息,1秒后再次发送一个消息

                                   mCallbacks.finishBroadcast();

                                  
sendMessageDelayed(obtainMessage(MES), 1 *1000);

                                   }

                                  
break;

                                  
default:

                                  
super.handleMessage(msg);

                                   }

                            }

 

                     };

四、     
总结:

所谓的消息机制其实很简单,实现这种机制需要只需要四步:

a) 
实例化Looper(因为实例化Handler时需要一个looper

b) 
实例化Handler,这里需要覆盖handleMessage方法,处理收到的消息

c) 
实例化Message对象,调用已经实例化好的handler对象的obtainMessage方法,把数据传给obtainMessage方法,obtainMessage方法就会实例化一个Message对象。(这里也可以发送实现Runnable接口的对象)

d) 
调用HandlersendMessage方法把实例化好的Message对象发送出去。

对每个线程过程都是一样的,只要按照上面的四

个步骤来就可以发送和接收消息了。

抱歉!评论已关闭.