handler原理解析

Handler原理

Handler运行流程图

Handler的使用

首先我们都首先必须知道Handler消息机制的原理,再结合我们使用的代码进行分析。原因是我们平时如果再主线程使用handler的话会隐性调用两个方法,如果我们不知道的话就无法做出正确的分析。这两个方法就是

Looper.prepare()

以及

Looper.loop()

只有按顺序的调用这两个方法后才能使用handler

Handler的原理

原理图在上有很多,大家可以自行查找,在这里只做简述

1.涉及三个角色:Messagequeue,Handler,Looper

2.三个角色功能:Messagequeue消息队列,Handler处理消息,Looper拿去消息给Handler处理

3.流程:创建使用Looper.prepare()创建Looper,同时在其内部会创建Messagequeue消息列表。然后创建Handler复写接口(自动绑定到创建线程所拥有的Looper),最后通过Looper.loop()不断拿取消息并发送给Handler处理

           Looper作用?:

         通过loop(for死循环)查看当前的消息链表中是否有需要处理的message。

         MessageQueue作用?:

         用来存储message的链表(链表中的消息message是按when(当前系统的时间戳)从小到大的排列)。

         Message作用?:

         用来存储消息内容

总结

至此从消息发送到消息拿去并处理的大体上的源码已经全部初步解析,总的来说是以下的步骤:

1.调用Looper.prepare(),创建线程必要的Looper和Messagequeue(会自动和当前线程挂钩)。一个线程只能拥有一个Looper,从上面检测的代码可以看到。

2.创建Handler,并覆写处理消息的接口实现其dispatchMessage方法(自动与当前线程的Looper和Messagequeue挂钩,没有的话会报错)。

3.通过Hander.sendMessage方法来发送消息(这个过程msg会正式和当前handler挂钩,使其拥有handler的引用)

4.调用Looper.loop()方法开启死循环,遍历Messagequeue拿去msg,并使用msg中handler的dispatchMessage方法将msg发送到handler中去。

5.dispatchMessage方法调用我们创建Handler时覆写的接口,完成消息处理。

一个线程只能有一个Looper,一个Looper对应一个Messagequeue,一个Handler也只能对应一个Looper,但是一个Lopper却可以对应多个Handler(即可以有多种不同的处理方法)

你可能感兴趣的:(handler原理解析)