Handler机制源码分析

一.
Carson的handler机制的源码分析写的非常的清晰,强烈建议大家去学习,我今天写这篇文章只是做简单的补充。
Handler机制源码分析

1.Handler 类中,分发处理消息的方法dispatchMessage():

    
    /**
     * 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);  // 第三处理消息的地方
        }
    }

在对消息的处理方法中有三处处理消息的地方,对应着三种处理消息的方法
首先是第一种 ,msg.callback != null 就去执行 handleCallback(msg) 这个就是我们熟知的 执行 Runnable的方法,而第三种就是 我们熟知的重写 Handler的handleMessage方法,来实现对消息的处理。而第二种呢? mCallback 是什么? 在Handler的代码中找到mCallback 是Callback 类型,而Callback 是一个接口,如下:

   public interface Callback {
    
    
        /**
         * @param msg A {@link android.os.Message Message} object
         * @return True if no further handling is desired
         */
        public boolean handleMessage(Message msg);
    }

那个mCallback 又是怎么来的,其中看看 Handler的构造函数就能发现端倪:这个mCallback 是创建Handler是传进来的。

     * @param callback The callback interface in which to handle messages, or null.
     */
    public Handler(Callback callback) {
    
    
        this(callback, false);
    }

真相大白了,dispatchMessage中对应的第二种处理消息的方式其实就是 通过创建Handler时,传进来的,实现了Callback 的参数实现的(这个参数可以为null)。
2.同步屏障:
同步屏障
3.handler阻塞机制
阻塞机制
4.保证一个线程只能有一个Looper,一个消息队列的机制 ThreadLocal
ThreadLocal

猜你喜欢

转载自blog.csdn.net/qq_41095045/article/details/123888022