Android消息机制小结

2018-03-20  本文已影响10人  r09er
Android消息机制:
Handler的主要作用:
Android中使用消息机制的原因:
void checkThread() {
        if (mThread != Thread.currentThread()) {
            throw new CalledFromWrongThreadException("Only the original thread that created a view hierarchy can touch its views.");
        }
    }
Handler工作过程:
Handler工作过程.png
MessageQueue创建和工作原理

由于Looper是使用ThreadLocal保存的,由此得知每一个线程都只有一个Looper和一个MessageQueue

 private Looper(boolean quitAllowed) {
        mQueue = new MessageQueue(quitAllowed);
        ...
    }
 private boolean enqueueMessage(MessageQueue queue, Message msg, long uptimeMillis) {
        msg.target = this;
        if (mAsynchronous) {
            msg.setAsynchronous(true);
        }
        return queue.enqueueMessage(msg, uptimeMillis);
    }
Looper的工作原理
new Thread(){
            @Override
            public void run() {
                Looper.prepare();
                Handler handler = new Handler();
                Looper.loop();
            }
        }.start();
Handler工作原理
Handler的dispatchMessage具体执行流程
 public void dispatchMessage(Message msg) {
        if (msg.callback != null) {
            handleCallback(msg);
        } else {
            if (mCallback != null) {
                if (mCallback.handleMessage(msg)) {
                    return;
                }
            }
            handleMessage(msg);
        }
    }

在消息处理阶段,优先判断Message的CallBack是否为null,而这个callBack实际上就是handler的post方法传递进行来Runnable,然后就调用handleCallback方法,其实只是简单的调用Runnable中的run方法.

 private static void handleCallback(Message message) {
        message.callback.run();
    }

当Callback为空,则检查mCallback接口是否为null,不为null就调用mCallback的handleMessage方法.mCallback其实是Handler的一个接口,可以在创建Handler的时候作为构造参数.

//CallBack接口使用方法

 Handler handler = new Handler(new Handler.Callback() {
                    @Override
                    public boolean handleMessage(Message msg) {
                        return false;
                    }
                });

调用了mCallback的handleMessage方法后,如果返回了true,这条消息已经被正确处理,如果返回false,最终调用Handler的handleMessage方法,结束消息处理过程.


Handler消息处理流程图.png
上一篇下一篇

猜你喜欢

热点阅读