00:00
来。下面我们要说一个啊,比较重要也比较难的一些东西,就是关于消息机制的原理,和它的源代码相关的一些知识。先来看一下它的一个原理的一个结构图。这个图呢,它是一个。动态图我们来看一下。首先呢,我们可以想象啊,有两个,有一个主线程,就是我们的程序一旦运行起来,就有一个主线程已经在了。我们是不是在主线程里面创建了一个handle的对象吧?好,接着呢,有一个分线程。好在分线程里面,我们是不是可以看到主线程那个handle了吧,因为它是个成员变量嘛,对吧。啊,我们可以去引用这一个handle是可以的,他们其实是同一个对象。下面我们要去用。
01:01
用它有一个基本的步骤啊,首先我们是不是得整一个message。啊。这个地方是创建Mac对象。好,接着干嘛呢?发送message。发生哪去了呢?叫消息队列message q对吧,嗯。这个发送是不消耗什么时间的,你想想看嘛,像一个集合里面添加一个对象。是不是瞬间就可以完成了?也就是说,我发1000个消息,发1万个消息需要很长时间吗?不需要对吧。瞬间就可以完成,因为就是添加一个集合嘛,往集合里面添加一个对象。下面。有另外一个。非常重要的一个人,叫lo。啊,我们叫它循环器,叫它钩子。这个钩子勾什么呢?
02:00
Message从这个消息队列里面取出一个当前需要处理的消息。好,取出来以后交给谁处理啊?是不是叫hand的处理啊?对吧,就调用handle来处理它。这一个处理我们一般情况下是不会操作。UI呀。能看到吧,好处理完成以后我那个message。是不是就没有什么太大的用途了,对吧?啊,我有两种处理方式,要不然把它回收。啊,回收了有点浪费,知道吧,只说的回收就是把它变成垃圾对象,把它销毁,那个不太好吧,我们应该怎么做呢?当然有一个概念叫清理message。什么叫清理?那个message里面是不是有很多数据啊。那个数据不能再用了吧。
03:00
得把数据给你什么。是给他回到以前原始状态啊,默认状态,嗯。好,这个是不是放到message内部了啊,等会我们可以看它的里面的一个结构啊,它内部有一个叫message词,也是消息词。接着大家看它是不是是一个。整个是一个它自己自主的一个生态系统啊。嗯,大家看这里面是不是形成一个闭环了呀。这样。那去做。啊,上一个班就有一个哥们。啊,进公司面试就把这个图画了一下,成功了就。就画了一个图,那他回来就说,我就基本上就是靠这个图打打动的那个面试官后来要他了。有的人说哇,那这的话那还学啥,你就把这个图,把这个图多画几遍,画画的更更好一点,比这个可以画的更好一些是吧,但是那个那个你你不能说是可遇不可求的,对不对,而且你别的知识也不能太差了,对吧,问你别的啥也不懂,都没机会问这个问题知道吧。
04:16
你说实话,你去面试之前得先需要准备一些点。对吧,有些点是一旦问起来我就答的特别好的点,这个点越多,那你成功的几率就越大。从概率学生来说就这样的,对吧,但是真正的真正去面试的时候,有时候概率学起不了太大作用。说不定一踩一上去就中了啊。但是大家啊,实力是关键,有了实力其实迟早要中。这个流程大家是清楚了吧。现在我们说的是不是主线程和分线程之间通信用handle了呀?其实大家有没有想过,其实咱刚才做了这么多,咱这个有用到分线的吗。
05:03
有吗?没有。那是不是没有分线制就不能用hand了呢?不是。啊,就是你会发现我们这个地方啊,用handler它能实现一个统一的一个任务调度的一个事情统一的去执行。知道什么叫调度吗?就是分派任务啊,分派工作啊,对吧,我要去增加了,我要去减少了,对不对,还有一个我们当前的一个效果呢,它其实给大家说过了,叫。定时。循环。的一个工作吧。哎,像这种工作。用handler就比较非常方便的能够实现。对吧。并不是说一定要有啊,先搞一个分线程,再搞个主线程,又焊了,咔嚓。
06:00
不是这么回事。就是它可以去做啊,分线程与主线中,也是它的最主要的一个功能。但县城内部他也可以做。啊,这个下面再给大家看一个图。这样的服务也挺有意思。大家看它这么多的,我们用handler,大家看到现在它有这么几个对象handler。对吧。这是我们的安,还有什么呢?Q叫消息队列还有一个。No。看看他们怎么运转起来的啊。先,我要干嘛?不能发消息啊,把消息发哪去了呢?是不是消息队列里面。我要再发是不是。过去阅读啊,那消那消息队列里面,消息之间它是怎么关联的呢?链表。
07:01
那作为一个链表来说,它里面每一个啊,这整个是一个列,整个是一个列表的结构,就整个它是一个列表的结构啊,链表里面的每一个对象,我们叫它什么呢?大家知道吗。对,有人就知道了,叫节点。对吧,每一个节点呢,都是一个对象。大家看是不是现在有两个节点呢?啊,两个message对象啊,这个message它内部有一个属性。叫什么呢?Leg似的。你说那属性什么类型。啊。Ne属性什么类型的next?什么东西?你说next,我这个,我这里面有个message,我要想能看到下一个是不是我的有一个属性指向下一个。那你说next什么类型?引用类型,那那你不白白说了吗。
08:00
就是message类型。不然的话,我怎么指向下一个卖呢。对不对。啊,等会我们来看啊,好。这个我是不是还得往下一直往下去,往下放啊。啊,最终就形成了一个。链表的结构是一个消息队列。好。接着另外一个人,Loop。取出什么呢?待处理的消息。取出来以后是不是交要交给handle来处理啊。它这里面有个概念,调用handle有一个方法叫despite message,大家要知道这个这个方法什么意思。叫分派、分发的意思。啊,就分发给我的handle了,为什么要叫分发了,对不对,涉及到后面的一个知识。下面我们我们后面是说是不是直接交给handle的处理啊,其实中间有一个分发的过程。
09:03
什么意思呢?我把这些都拿出来,大概真正去处理消息有三种方式。有,有可以处理。啊,有handle了,有可以处理。还有一个就是我们用的。Ho,有什么呢?Hand me方法可以处理。其实真正的内部,它有三个可以处理的方式。那我们现在呢,用的是第三种,也是最常常用的一种。其他两个呢,我等会可以给大家简单的介绍一下。啊,用的少一些,所以它叫分发。啊。不是直接交处理啊,你是分发给handle德的,他自己由他来决定到底用哪一种方式来去处理。重点是在于这个过程大家要知道,同时大家应该也要把那个队列什么列表的结构有一个基本的理解。
10:07
啊,这样我们就把消一日的一个基本原理先简单的跟大家说了一下。停下来。
我来说两句