looper

####Looper.prepare

Looper通过sThreadLocal来判断该线程是否已经创建Looper

构造函数里,创建了MessageQueue(),获取当前线程的Thread实例。并且把Looper的实例放到ThreadLocal中。

在MessageQueue的构造函数里,调用了nativeInit(),这个方法就是初始化底层的那个epoll了,返回一个native的一个唯一值吧

Looper.loop

一个死循环,死循环里从MessageQueue中获取Message,中间会有一系列关于开始结束时间的逻辑暂时先不用看。

之后会调用msg.target.dispatchMessage(msg);,message的target就是handler的dispatchMessage。

new Hander

获取looper和messageQueue的实例,获取Looper是通过myLooper方法,myLooper里面是通过ThreadLocal来获取的。

handler.sendMessage

会调用sendMessageDelayed(msg,0),第二个参数是延迟几秒。delayMillis如果小于0,那么就等于0。再调用sendMessageAtTime(msg, SystemClock.uptimeMillis() + delayMillis)SystemClock.uptimeMillis()是从开机到现在的毫秒数(手机睡眠的时间不包括在内),中间判断了一下是否有MessageQueue,之后调用了enqueueMessage(),

enqueueMessage(): 将Message的targe指向这个handler,之后就调用了messageQueue.enqueueMessage()

MessageQueue.enqueueMessage

变量传入了一个要传送的Message和要发动的时间。

设置Message正在使用的标志,设置Message要开始的时间。如果messagequeue为第一次使用的话,那么

mMessage = msg ->null

之后调用,需要将message放到正确的位置,message是一个单链,所以遍历找到when < 每个message.when或者链尾的位置,把他加到单链里。最后调用nativeWake(),把之前init之后得到的唯一值放入

至此,我们就把Message传入MessageQueue看好了,接着看看Looper如何把Message给到Handler。

Hander.dispatchMessage(Message)

这里就直接下发Message,但是只会分发到一个地方。优先级从高到低为Message的callback,handler的callback,重写方法handlerMessage