Handler机制的过程

 

Handler机制:

handlerMessageLooperMessageQueue

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机制。  


猜你喜欢

转载自blog.csdn.net/mofeite_lihe/article/details/64123333