首先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()方法让轮询器工作就可以了。
网友评论