Looper
perpare(这个方法中首先通过 Threadlocal 来判断当前存不存在loop,如果
如果存在就抛出异常,如果不存在则 new 一个looper对象并保存到threadlocal中)
looper(由上面perpare方法创建之后,looper的构造方法中new 了一个messagequeue)
一个looper可以有几个messagequene?
第一步,handler是如何关联上looper的?
在handler中有两个成员变量,mlooper和mQueue(messagequeue),在handler默认的构造方法中有个looper.mylooper方法,这个方法从threadlocal
中取出looper,赋值给成员变量的mlooper,以及mlooper.quene赋值给成员变量的mqueue,mlooper.queue实际上是loop构造方法中new 出的messagequeue赋值的成员变量。
第二步,sendmessage,sendmessagedelay,最终都是调用到了sendmessageattime方法,在sendmessageattime方法中
最终执行到了handler中的 enqueuemessage方法,并指定了target
然后调用到了messagequene中的 enqueuemessage 在这里就有个
无限循环不断的把消息放到消息队列里面。(还是在handler类中)
第三步,在looper 中的looper 方法中有个无限循环将消息取出来,其中有个关键的方法是 在无限循环中调用了handler的dispatchMessage方法,dispatchMessage方法最终调用了handlermessage方法或者handlercallback方法
注意:Handler在哪个线程创建的,就跟哪个线程的Looper关联,也可以在Handler的构造方法中传入指定的Looper(这个和研究handlerthread 中的那些情况很像。)
一个线程只有有一个looper(源码得知,threadlocal会判断),但是一个线程可以有多个handler,但是他们的消息队列都是同一个,messagequeue也是同一个。looper是则呢么区分handler的?通过handler中的 enqueuemessage方法 中的 traget来区分
描述,首先一个线程想要拥有loop,会开启looper的perpare方法,在这个方法中使用threadlocal来判断当前线程有没有looper,如果有则抛出异常,如果没有则new一个looper并保存到threadlocal中,在looper的构造方法中会new一个messagequeue方法,并赋值给looper的成员变量,接着再handler中有两个成员变量,looper和messagequeue,并在handler的构造方法中,有个loop.mylooper方法,取出存放在threadlocal中的looper并赋值给handler成员变量的looper,然后获取到looper后再把looper在构造方法中获取到的messagequeue赋值给handler成员变量的messagequeue。这样handler就完成了looper和messagequeue的绑定。
然后在handler发送消息的时候,就是sendmessage或者sendmessagedelay实际上最后调用到了sendmessageattime方法,这个方法最后又调用到了enqueuemessage(实际上最后调用的是messagequene中的方法)方法,首先在handler的enqueuemessage方法中指定了有个赋值traget的过程,为message区分是哪个handler发出的,接着调用到了messagequeue的enqueuemessage方法,这个方法有个无限for循环将message放入到消息队列中(这个消息队列实际上是一个链表结构)。最后通过looper的loop方法,一个无限for循环把消息队列中的消息取出,接着通过dispatchmessage方法将消息发送出去,最终调用了handlermessage方法来处理消息。
handler中发送消息时候的obtain方法或者是handler.messageobtain方法,这个是用来复用msg的
关于handler.postdelay 方法。
最后发现Handler没有自己处理Delay,而是交给了MessageQueue处理,在MessageQueue.next方法中,首先会判断now 当前时间和 msg.when 的大小,如果有延迟会计算这个时间 nextPollTimeoutMillis 。然后会在轮询的时候交给MessageQueue 中的 nativePollOnce 方法进行延时。