Android Handler传递的对象,Message中的Runnable回调

来源:互联网 发布:一叶落而知秋为什么余 编辑:程序博客网 时间:2024/06/05 23:08

问题:Handler中传递的是什么, post(Runnable r) 和sendMessage(Message msg) 的区别

分析:LooperMessageQueue一一对应,创建一个Looper的同时,会创建一个MessageQueue。而Handler与它们的关系,只是简单的聚集关系,即Handler里会引用当前线程里的特定LooperMessageQueue。因此,Handler是在主线程还是在子线程处理消息,主要看创建Handler的Looper是主线程还是子线程。

     Handler中传递的是message对象,查看post(Runnable r)方法源码:

public final boolean post(Runnable r)    {       return  sendMessageDelayed(getPostMessage(r), 0);    }
private static Message getPostMessage(Runnable r) {        Message m = Message.obtain();        m.callback = r;        return m;    }

可以看到,最终传递的还是Message对象

那么问题来了,如果一个handler 重写了handleMessage(Message msg)方法,并且用post(Runnable r)来发送消息,那么handleMessage(Message msg)方法中的代码能执行吗?看Handler是如何分发消息的:

   /**     * Handle system messages here.     */    public void dispatchMessage(Message msg) {        if (msg.callback != null) {            handleCallback(msg);        } else {            if (mCallback != null) {                if (mCallback.handleMessage(msg)) {                    return;                }            }            handleMessage(msg);        }    }
private static void handleCallback(Message message) {        message.callback.run();    }

可以看到,当处理的message对象有callback对象时,执行callback的run方法。

1 0
原创粉丝点击