Android 从源码看Handler消息机制

来源:互联网 发布:苹果电脑怎样删除软件 编辑:程序博客网 时间:2024/05/18 03:09

今天闲的无聊,实在不知道干嘛了,就想起来android中很重要的一个东西,消息机制,也就是我们常说的handler消息机制,下面我们就来一起看看;
1 实例化Handler

    Handler mHandler = new Handler() {        @Override        public void handleMessage(Message msg) {        }    };    我们来看看Handler里面的handleMessage的方法说明,有这么一句话:    /**     *子类必须实现,虽然不是抽象方法      * Subclasses must implement this to receive messages.     */    public void handleMessage(Message msg) {    }

2 分发消息

    /**     * 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);        }    }我们一般使用message只会给what和obj赋值,其实Message还有其他字段,如callBack,而mallback就Handler里面的一个接口,只有在使用public Handler(Callback callback, boolean async) 重载方法的时候才会给他赋值,所以这里他是null,这样就直接调用了Handler的handleMessage方法,讲消息分发到了我们重写的handleMessage方法再进行处理;

3 获取msg

public static Message obtain() {        synchronized (sPoolSync) {            if (sPool != null) {                Message m = sPool;                sPool = m.next;                m.next = null;                m.flags = 0; // clear in-use flag                sPoolSize--;                return m;            }        }        return new Message();    }或者new Message()都可以;

4 发送消息

    private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {        msg.target = this;        if (mAsynchronous) {            msg.setAsynchronous(true);        }        return queue.enqueueMessage(msg, uptimeMillis);    }源码中消息最终在这里加入消息队列,而这个方法就是Handler里面的方法,this指的就是Handler,可以看出,每一个Message都有一个标记。

5 消息队列
如果在主线程中new Handler的话,系统或初始化一个,所以我们可以直接用:

private Looper(boolean quitAllowed) {        mQueue = new MessageQueue(quitAllowed);        mThread = Thread.currentThread();    }

如果在子线程:

public static void prepare() {          prepare(true);      }    private static void prepare(boolean quitAllowed) {          if (sThreadLocal.get() != null) {              throw new RuntimeException("Only one Looper may be created per thread");          }          sThreadLocal.set(new Looper(quitAllowed));     }   private Looper(boolean quitAllowed) {         mQueue = new MessageQueue(quitAllowed);         mThread = Thread.currentThread();     }子线程要先prepare,可以看出其实最终都是调用的Looper这个方法;
0 0
原创粉丝点击