Handler的消息派发

    通常来讲,使用handler都是继承handler重写handleMessage()方法来处理事件。但是handler可不只有这种方式能够处理事件。handler有三种方式

 

  1. Message设置callback
  2. Handler设置Callback
  3. 重写handleMessage()

 

      为什么我上面写的两个callback一个大写一个小写,这是有原因的 。Message中的callback是它的一个成员变量,类型是Runnable,而Handler的Callback是一个嵌套类Handler.Callback

 

那么怎么使用这三种方法来设置事件呢?

  • Message设置callback
Message msg = Message.obtain(h1, new Runnable() {

	@Override
	public void run() {
		Log.d(MainActivity.class.getName(), "Message.callback");
	}
});
h1.sendMessage(msg);
  • Handler设置Callback
Handler h2 = new Handler(new Handler.Callback() {

	@Override
	public boolean handleMessage(Message paramMessage) {
		log("h2.Callback.handleMessage");
		return true;
	}
});

 

  • 重写handleMessage()
Handler h1 = new Handler() {
	public void handleMessage(android.os.Message msg) {
		log("h1.handleMessage");
	}
};


    既然三种方式都可以设置事件,那么它们的优先级,或者说执行流程是怎么样的呢?

  • 执行顺序Message.callback > Handler.Callback >Handler.handleMessage()
  • 如果Message.callback 不为null,则只执行Message.callback ,就是说Message.callback 可以屏蔽Handler.Callback和Handler.handleMessage()
  • 如果Message.callback 为null,且Handler.Callback 不为null,执行Handler.Callback
  • 在Message.callback 为null的情况下,如果Handler.Callback为null或者Handler.Callback 不为null但Handler.Callback .handleMessage()返回了false,则执行Handler.handleMessage()

 

      是不是看起来有点头晕。我们直接看Android的源码怎么写的

      首先在Looper中

public static void loop() {
        ...
        for (;;) {
        	//Looper获取到Message
            Message msg = queue.next(); // might block
            ...
            //派发这个消息的事件
            msg.target.dispatchMessage(msg);
            ...
            msg.recycle();
        }
}


然后再去看看Handler的dispatchMessage()

public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
        	//如果Message设置了callback执行完后就直接返回了
            handleCallback(msg);
        } else {
        	
            if (mCallback != null) {
            	//如果Handler设置了Callback,则调用Callback
                if (mCallback.handleMessage(msg)) {
                	//如果Handler的Callback返回了ture,直接就退出了,执行不到Handler的handleMessage()
                    return;
                }
            }
            //很明显
            handleMessage(msg);
        }
    }

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值