Handler Message Messenger

每个线程都有一个Runloop。runloop依次处理系统的消息Message。


每个消息要处理前都要投递到线程的消息队列中去,一个Message所包含的内容包括:

1.消息的标识what,
2.消息的内容,arg1,arg2, object,bundle
3.消息的处理者, Handler target。

这三者不能缺少。


每个消息可以指定一个Runnable callback. 如果某个消息指定了这个callback.则只会调用这个callback函数,这样的目的是可以不用派生某个消息而直接异步调用某个函数。比如:


Message.obtain(new Handler(), new Runnable(){

    void run()
    {
       //do something…..
    }

}).sendToTarget();






Runloop 依次从消息队列里面取出消息Message . 然后调用消息的处理器Handler target的 dispatchMessage函数。


这里一个Handler必须挂接在一个runloop下,如果不指定runloop,则在handler对象建立时是以当前线程的runloop,而且激发的线程也是在当前线程的runloop下。


Handler的dispatchMessage函数内部实现如下:

1.优先检测处理的消息Message有没有自带callback.如果有则调用消息自带的callback的run方法。

2. 如果没有自带callback,则判断Handler对象有没有指定一个CallBack mCallBack:

 public interface Callback {

        public boolean handleMessage(Message msg);

    }


 

如果指定了则调用这个mCallBack的handleMessage函数,如果这个函数处理了逻辑返回true则整个处理完毕,如果返回false则调用Handler本身的handleMessage函数,这样的目的是我们可以不必要派生一个Handler类来实现handleMessage,而是指定一个外部的消息处理逻辑来处理消息。



public void dispatchMessage(Message msg) {

        if (msg.callback != null) {

            handleCallback(msg);

        } else {

            if (mCallback != null) {

                if (mCallback.handleMessage(msg)) {

                    return;

                }

            }

            handleMessage(msg);

        }

    }







某个Handler无法跨越Activity或者跨越进程进行传递,因此2个进程或者Activity之间要进行通信回调必须通过一个Messenger对象,这个对象是可以序列化的。并且以一个Handler作为构造参数,可以把创建的Messenger通过Intent传递给其他Activity,被调用的Activity就可以从Intent得到Messenger对象,然后构造出一个Message对象,并调用Messenger的send函数来激发Handler处理事件:

调用者:

Handler h = new Handler(new Handler.Callback() {

@Override

public boolean handleMessage(Message msg) {

// TODO Auto-generated method stub

Log.v("abc""msgwhat:" + msg.what + msg.obj.getClass().getName());

return false;

}

});

        

         Messenger mgr = new Messenger(h);

        

         Intent intent = new Intent(YxbFirstTabActivity.this, FocusBankSelectActivity.class);

         intent.putExtra("oybq", mgr);

         startActivity(intent);



回调者:



Message msg=Message.obtain();

msg.obj=FocusBankSelectActivity.this;

try {

mgr.send(msg);   //mgr从Intent中获得。

catch (RemoteException e) {

e.printStackTrace();

}



你可能感兴趣的:(handler,message,messenger)