在Handler之前,这个异常抛出了就说明一定要用prepare这个方法去创建Looper对象,这样保证用handler发送消息最终会被添加到MessageQueue中的,而MessageQueue又是由Looper来进行管理的和创建的,创建在prepare方法中,
prepare这个方法这个方法内部比较简单,就是用来创建Looper对象的。
内部通过一个sThreadLocal容器来存放Looper对象本身的。为什么通过这个容器呢,因为sThreadLocal用来保存的话他就可以保证我们每一个线程获取到的Looper都是唯一的。sThreadLocal在很多地方也被叫做线程本地变量,它能在每个线程每个变量都创建一个副本,每一个线程都可以访问副本内部的变量,这样就不用每创建一个线程就取别的线程的变量而导致不同线程的变量一致的这种现象,他最好的好处就是每个线程都是独立的,取该线程就是该线程的变量而不会改变其他线程变量的值。
首先它会判断,判断sThreadLocal这个对象是否已经创建Looper对象,不为空的话就表示一个Looper已经被创建好了,就不用再重新创建了。然后通过send方法将没有创建好的线程的Looper对象放到sThreadLocal这个容器当中以便下次可以直接使用。
looper的构造方法我们看一下Looper的构造方法。在创建Looper对象的时候,MessageQueue对象也被创建,这样我们就能保证Looper对象当中持有MessageQueue对象,从而让handler,looper,messageQueue三者结合成一体。
——我们知道handler作用就是发送消息和处理消息,而handler发送消息必须发送到指定的MessageQueue消息队列当中,MessageQueue上一小节介绍了两种操作,一种是读取,另外一种是插入。要注意的还有,MessageQueue消息队列数据结构并不是队列,它是由单链表构成的,但是仅仅有handler和message还是不够的,必须还有一个looper轮循器,looper轮循器是每一个线程独有的一种变量,所以说她能够保证从message queue中取出Message交给我们的handler进行相应的逻辑处理。
网友评论