00:00
好,先我们要一起来看一下关于消息机制的一些相关的API。啊,先给大家说两个最重要的。也是大家必须掌握的,一个叫message,叫消息,一个叫什么呢?Handler处理器。什么叫消息呢?非常简单,我们现在是不是说了有一个分线程,有一个主线程呢?啊分线程是不是联网获得了数据对不对啊,得到数据以后要在主线程去执行,那也就是说做一个什么事呢?就发一个消息,发到哪个线上去。是不是主线程去执行呢啊,你得吧,而且这个消息是不是要把可以把数据给带过去啊。可以吧,带过去,接着在主线程里面去处理数据,去更新界面。这就所说的消息。那谁来发消息啊?
01:00
大家谁吧?处理器来发消息啊。处理不是分县城,县城是不能发消息的。线程其实是执行代码的一个载体,我们是某一行代码可能在某一个线程上执行吧。对吧,Handler就是用来去分发消息的。好,我们来看一下这个消息有哪些相关的一些东西啊。大概。在这里面呢,我们的消息可以这个说的特别文绉绉的一个话啊,线程间通讯的一个叫数据专业。啊,其实平常的时候交流的时候没人这么说。啊,太官方了。好,大家看着你就理解成我从一个线程到另外线程传递一个数据,谁是数据的载体啊?不就得了吗?好。下面来看一下。
02:00
Message呢?可以携带需要的数据。关于一个类,我跟大家说过,就是怎么样创建对象,怎么样使用对象吧,就这三个方面,两个方面啊好,第一个创建对象,它不是六。啊,它是通过它里面有一个什么呢。静态方法,这不点嘛,直接点叫。为什么用over,后面再跟大家说,其实他也有也有公开的购票方法,但基本上不用。好,这个地方传入一个what。下面就要说它里面的一些属性了。有一个东西叫what,其实我可以把它取成ID更好一些。因为ID你就知道了,这是一个什么。是标识啊。啊,标识就是标识不同类型的消息。好,这三个都是用来存数据的。然后下面上面两个用来存什么类型的数据。
03:00
Int数据,而下面这个用来存什么数据?任意类型的数据都可以。对吧。能看懂吧,而且你会发现它一个特点。它是一个什么。公开的,那公开的有个什么特点呢?大家想他还需要什么set get方法吗?不需要了。对,你直接通过对象点是不是就可以啊,给它设置属性读取属性呢。嗯,它是为了简化你的数据存储和获取的操作。好,下面一个,另外一个就是含等的了。Handle了,这玩意啊,大家看的。它能做什么呢?它叫message的处理器。同时处理,那是不是要处理消息啊。它处理消息的同时,他还干别的。发送。这是一个,还有什么呢,移除。
04:03
什么概念?大家看到前面两个,我们说的是发送消息,叫handle send message,发一个消息。好,下面有一个send message delayed delay什么意思?延迟后面是不是指定的时间呢。这个以什么为单位?嗯,大家还是挺聪明,知道用毫秒了,感觉是吧。嗯,感觉很对啊。啊,这个地方有发及时消息和发延迟消息,那你说什么是延迟消息啊。就是消息是不是要被处理的。说白了就是我们简单的说就是过一会再处理对不对,就延迟处理的消息。但是我要跟大家说。也发送延迟消息,并不是指的延迟发送。而是什么呢?颜值处理。那延迟发送,延迟处理它是两个概念,懂意思吧。
05:00
它是都会马上发。但是如果你发的及时消息,那就立即会被什么处理?那如果你发的是个延迟消息呢?那就过一会再处理。对吧。啊,通过哪个方法来处理消息呢?其实这是一个回调方法。连着老师。明显不一按开头这什么回调方法。我前面只是说以按开头的方法是回调方法,我可没有说所有的回调方法对按开头。是这意思吧,有的回答它已经设成它不是按开头。啊,它是用来处理消息,你按开头的方法是确实是回答完,因为它的意思是什么,在什么,什么时候执行。你说我处理消息是说在什么时候执行吗?为什么不用以按开头?这不是那个意思,这个语境不对,懂我意思吧。
06:01
语境,根本就不是on什么什么的语境。就老外去定义方法的时候,相对来说还是比较的客观的,比较到位的。你看,我们安。什么意思?就这个方法在什么时候执行,当我的对象被什么创建的时候执行。对吧。而这一个方法就是用来去处理消息的。所以他就叫了一个message处理消息。反确实就是一个回调方法啊,我们怎么知道回调方法,回调方法那我怎么做。如果他是要回调的话,我怎么做?重写你要一定要知道一般方法我是不是去调用啊,通过对象调用,如果是一个回调方法,那我就重写。对不对。这个啊,虽然说理解起来是比较比较简单的两句话,但是对我们来说比较有用。
07:01
啊,大家要知道这一个是啊好。还有一个最后一个。叫什么呢?移除还未处理的消息。这里面有一个很重要的。微重点你就说消息已经处理掉了,你还移手个什么呀。对不对?只有未处理的消息才会移除,那怎么会存在未处理的消息呢?因为你有发了延迟消息啊。对吧,前面是不是说过。发送延迟消息是先发送好了吧。那大家在想,是不是应该有一个结构来传消息?对吧,好,下面就跟大家说另外一个。叫消息队列,队列是什么特点?是不是先进先出啊。嗯。好啦。但是啊,这个MYQ它是一个优先级队列。
08:00
有什么意思啊,先说对应的特点是先进先出,也就是说譬如说我一下子。发了五个消息。都是发的即时消息,发abcd啊ABC吧,三个消息吧,你说谁先处理啊。A先处理吧,处理完A以后才处理什么?B、接着再处理C吧。所以说这是队列的一个特点,对不对。啊,先进去先先出来嘛。啊。那我想大家假设我A呢是发了一个即时消息,B呢发了一个延迟消息。啊,谁呢,发的是个即时消息。啊,你说现在。B和C谁先处理啊?是不是C先处理。也就是说我真正放的时候,我假设这是一个容器啊,这是个。用一个用一个垂直的线吧,这容器我先放了个A是吧,接下来放了一个B。这意思吧,按道理来说,是不是先处理完A,接着处理B啊好,我这个B呢,是一个延迟消息。
09:03
我后后来又放了一个CC,那放哪去。他是不是插到A和B等于什么。是不是中间呢。四要。叫一个什么呢?优先级队列。他有优先级的。就是不是完全按放的先后顺序。来一排的。后面会跟大家仔细的说啊,不急。啊,大家看。下面它里面用来存储通过handle发送的消息,这个没问题吧。它是一个按message的,有一个message有个属性。叫问问是什么意思啊?在什么时候执行就是处理。你说这个这个时间这个值怎么决定呢。我发送的时候是不是有一个当前时间呢。当前时间,如果发了四个即时消息,问等于多少?
10:00
是不是当前时间,那如果我发的这个延迟消息吗。当前时间加上什么?是不是延迟的时间就是标识了,他应该在什么时间被处理吧?啊,跟大家说啊,你说队列它其实是一个抽象的数据结构,真实在内存里面只存在两种数据结构。啊,一种是数组。啊,一个是列表。对吧。看这是在内存里面真正存在两个,就其他的结构,什么队列啊,什么站呢,都是抽象的结构,就是不是真实存在的,是我们程序员虚拟的一些结构。那他。抽象的结构呢?必须通过真实的结构来去实现,来去包装。啊,我们要实现一个队列,你说用什么结构比较好啊?用列表是比较好的。对吧,因为这里面涉及到很多什么插入啊。
11:04
很多,有可能涉及到什么遗嘱啊。啊,这个地方添加和删除比较多,用水比较方便。列表数组主要是读起来比较快对不对,根据下面要比读啊比较快,这些基本的一些数据结构的知识呢,大家也需要去知道。以前讲过吧。没回应啊,讲还是没讲过。你看有的同学都讲过了啊。后面我们再说啊,一点点说别急。好,下面来lo。也就是说现在啊,他是一个交一个什么呢。循环器,翻译过来,我更喜欢叫它钩子。钩子钩子什么意思?勾是勾东西的呗,对不对,那勾什么呢。他就去勾看看它循负责循环取出。
12:03
队列中当前需要处理的什么?消息。啊。处女,那取出来以后交给谁呢?交给对应的handler进行什么处理?处理完了以后大家看啊。加message缓存到有后面会说一个概念叫消息词。就说白了就是缓存结构,大家以前是不是学过线程词啊?啊。没有讲是吗?没有没有提过吗。没有提过线成词这一概念是吧?嗯。到底有没有提过?当时为了改进是不是?好,大家跟大家简单可以说一下,提一下就行,你要知道它是怎么一个结构就行啊,后面可以跟大家说一下。
13:00
啊。当然,我一跟大家说,大家就明白啊,消息时中已被什么呢?复用。啊,现在大家应该需要去理解了,为什么我用它我不六。就因为用这个方法,它可以用那个缓存池里面用以以前用过的。啊,缓存的。是不是效率要高一些啊,不要每次都创建。好,这个API呢,我们基本上不用他们俩,就我们去写代码,基本上99%是不用它的。除了,除非你做到高级的部分啊,可能会用到他们俩。一般我们是不用它的,所以大家重点是掌握这两个。
我来说两句