####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