Handler机制:
handler、Message、Looper、MessageQueue
handler就是在子线程发送消息、处理消息
1.Looper轮询器和MessageQueue的创建:
1.在使用Handler的过程中,没有使用Looper和MessageQueue对象,如果你在一个线程当中使用Handler机制的话,必须得有Looper和MessageQueue。
2.主线程会帮我们调用prepareMainLooper,也就是Looper.Prepare。
3.Looper.Prepare会通过threadLocal(线程单例,一个线程有一个对象)获取一下当前线程是否已经有了Looper,如果有,报异常,如果没有,new一个出来。
4.Looper.Prepare会调用Looper的private构造方法,把new出来的Looper保存到threadLocal中。
5.Looper在new对象的时候,在构造方法中会创建一个MessageQueue对象,并通过一个final类型的成员变量把MessageQueue保存起来,这样确保了一个Looper对应一个MessageQueue。
6.所以,一个线程对应一个Looper,一个Looper对应一个MessageQueue。
7.MessageQueue在创建的时候,也创建了一个nativeMessageQueue,这个nativeMessageQueue在JNI层。他们俩通过一个成员变量mPtr建立关系,mPtr保存了nativeMessageQueue的指针。这个指针保存着nativeMessageQueue的首地址,随时可以用这个地址访问到NativeMessageQueue。
2.Looper.Loop让消息循环:
为什么要有死循环,死循环为什么不会阻塞主线程?
1.死循环并不会阻塞主线程,而就是因为死循环让主线程的代码不会执行完,程序不会一闪而过
2.起到的作用就是:我不断的往消息队列发消息的话,通过Looper.Loop不断去取。
3.如果没有消息的话,他会睡在死循环queue.next这里,对应用不做任何操作,应用不会退出,就停在这。
4.取出消息之后,会调用msg.target.dispatchMessage。
1.这里有一个死循环,就是不断的去消息队列获取消息。
2.实际上,msg就是handler,handler.dispatchMessage会有3种情况:
1.如果我的msg有一个回调,Runnable对象CallBack的话,优先执行CallBack的run方法.
2.如果没有CallBack的话,再判断我的handler是否有CallBack。
3.如果有CallBack这个接口,优先执行CallBack接口里面的handlerMessage。
4.如果都没有的话,才执行handler的handlerMessage。
消息队列创建好了,也转起来了,就开始创建handler。
3.handler的创建:
1.创建handler的时候,先到当前线程获取Looper和MessageQueue找到。
如果是在主线程,Looper和MessageQueue的创建,应用程序、android系统帮我们创建;
如果是在子线程,使用handler的话,自己先调用Looper.prepare,子线程创建一个Looper和一个MessageQueue。再创建Looper.Loop让消息队列循环起来,再创建Handler。
4.通过handler发送消息:
1.发送消息就是调用sendMessage方法,实际上就是调用sendMessageAtTime。
2.在消息队列里有一个next方法,在消息队列里,只记录了所有消息里面最优先执行的第一条消息,剩下的消息都是通过next属性一个指向下一个。
3.sendMessageAtTime就是调用了 enqueueMessage方法,enqueueMessage方法就根据要执行的时间谁靠前、谁靠后,把消息排序。如果消息要立即执行的话,调用nativeWake,阻塞的代码不再阻塞,可以继续往下走;Looper.Looper就能取出消息,handler就可以去处理消息。
5.消息的创建和回收:
1.创建消息的时候,使用Message的obtain方法;使用obtain,会联系到消息池,消息池是一个全局的static变量,整个应用会共享同一个消息池,最多缓存50条消息。
2.当Looper.loop在代码中,Handler处理完消息之后,会调用message.recycle方法回收消息。
3.回收的过程就是把消息该置空的置空,该置null的置null,然后把消息塞到消息池里。
4.消息池的保存和 MessageQueue的存消息的机制是一样的,就是有一个sPool.
所有的空消息,第一条就是sPool,下一条就是sPool.next。
这就是整个Handler机制。