handler源码阅读

首先handler的分发过程主要涉及到四个类:Handler(分发器),Message(消息),Looper(轮询器),MessageQueue(消息队列)

1.MessageQueue—消息队列

从命名上可以看出是用于存储Message消息的

在这里插入图片描述

由此段代码可以看出每个Looper会有一个消息队列,所以消息队列与轮询器是一对一的关系。

2.Looper—轮询器

用于处理消息,它会将Message对象交给该消息对应的Handler 去消费掉,轮询器一旦调用loop方法将会进入一个死循环,不间断的去消息对接中取出消息再交给对应的Handler处理,为什么说是无限循环

在这里插入图片描述

(注:for(;;) 与 while(true) 是一个意思)由以上代码可以看出一旦开始将会一直循环下去,直到队列中没有新的消息为止。

3.Message—消息.

用于存储消息数据和回调方法,还有最重要的他的管理者handler

在这里插入图片描述

由以上代码可以看出每个message都会记录它是由哪个handler分发和处理,并且他的分发是在Lopper的loop方法中被调用。

在这里插入图片描述

结合上面两个截图可以看出Lopper在loop的过程中拿到Message对向并且调用Message对象的target(就是Handler)的dispatchMessage方法去分发事件。

4.Handler—分发器。

用于处理分发的消息。Handler被创建的时候会绑定一个Looper与之关联。

在这里插入图片描述

由以上handler的构造可以看出Looper-handler-message-messagequeue是由紧密关系的。

只有Looper的prepare和loop方法被调用的时候我们才可以通过Handler的去分发消息。但是我们平常使用的时候并没有看到这两个方法被调用,并且在子线程创建Handler分发消息的时候会报错。再看下下面的代码

在这里插入图片描述

这个main函数是不是很熟悉?没错就是我们在学习Java基础的时候经常看到的主程序入口。所以主程序在初始化的时候就在主线程帮我们调用了Looper.prepare()和Looper.loop()方法,这就是为甚么我们在主线程池创建Handler并使用的时候并没有问题。由以上可以知道,我们在子线程也是可以使用Handler的只需要调用下Looper.prepare()和Looper.loop()方法让轮询器工作就可以了。

你可能感兴趣的:(handler源码阅读)