00:00
好,接下来呢,我们讲解一下这个发布消息啊,这个源码的分析啊,这个代码呢,也就是一行代码啊,bus.get default啊点post里面呢,就是你发送的消息啊,也非常简单,那么来看一下发送消息。啊,来到代码中,代码中啊,这个main activity它是啊注册注册了这个运bus,注册完之后呢,他跳转到了B页面啊,或者跳转到C页面啊,B页面呢,是这个普通的消息事件,这个C页面呢,是粘性事件啊,我们先不考虑这个粘性事件,来到这个BTT来到这里面,这里面有两个按钮啊,一个是普通按钮,一个是对象的按钮啊发生对象了啊有什么区别呢?上面这个发送的消息类型啊,它是时运类型的。下面这个呢,发送的消息类型呢,它是message event啊,这个对象类型的啊,就是这样的啊,发生不同的消息啊,但是这个本质是一样的,那我们随便拿一个啊,看一下它的源码bus.get default,那我们看一下这个default。
01:05
这啊,还是单啊,跟跟我们之前看过的是一模一样的,这里呢,就不再赘述了。好返回来之后呢,直接进入到这个post,发送这个方法进来。进来之后啊,大家往下看啊,看哪呢?看这地方啊,看这地方。这个地方就是发送事件啊,发送事件上面呢,这个是啊,这是这个发送的状态啊,一些状态的描述,比如说这个point state点这个这是current post th state啊,它首先获取到当前发生的状态,当前发生的状态呢,它又调了一下这个event queen,也就是四键的队列。啊,大家啊,讲过那个handle的时候,那个是不是有个消息的队列啊,消息的队列这里面呢,是啊,事件队列里面存放的都是事件啊,这里面at一个event啊,之后再往下看,如果这个posting state啊,正在发生这个事件。
02:04
那下面取法,那就是没有在发生事件的时候,你才能去发送时间,如果正在发送,那么你继续就得等待啊,等待那么好往下走。如果当前这个事件队列它不为空,也就是事件队列里有事件消息,那么我就可以发送事件了啊,就这么一个过程,那具体核心代码是在这儿啊,发送消息好进来。进来之后啊,它首先得到事件类型,也就是你要发送的是哪个事件啊,它的类型是什么?点get class。啊,拿到这个事件类型,拿到事件类型之后啊,再往那看呢,往这看啊,发送该事件消息给注册了该事件订阅事件类型的订阅者。也就是要给谁定义了我这个事件,我就要给谁发啊,统一都是这个消息啊,根据这个事件类型来看一下具体怎么发的,再往下走。
03:06
再往下走啊,走到这来这来。这是这个事件类型,根据事件类型获取所有的订阅者,还记得这一个类吗?啊,Scription点啊,By invent type,这个是不是就是我们当初啊,把所有的事件都存放到这个集合里了啊,根据类型去存放这集合里了,那么接下来我就根据这个类型去拿到所有的这个订阅者。啊。当初。我们把这个,比如说这个是mayx,这个是BX,我们都给它统一存放到这个。啊,这个极合理了。那么接下来我们就根据这个事件类型,哎,去拿到你们这些订阅者,所有的订阅者都给你拿到。拿到之后干什么呢?向每个订阅者分发事件啊,它不为空啊,它不等于闹,且不等于空,那么就是循环向每个订阅者发送事件。
04:07
啊,再可以啊,打个比方,打个比方,比如说今天你们选了我的课啊,那我就给你们发送的消息,要是没有选我课的同学,那是不是不可不给他发送啊,就是这个意思。好,那么他订阅了,那我就给他发,那具体怎么发的呢?哎,是执行这个句子代码啊,具体的去发送,那我们看一下这个代码进来。是否分四种类型去发送啊,啊分别是这个啊,你发送的线程是什么,那我就在什么线程中去执行啊,这个呢是主线程中,这个是啊后台同步的线程,这个呢是后台异步的线程啊这四种类型啊,最终的发售啊都是通过反射。啊最终的发送都是通过一个啊反射反射的方式发给每一个的订阅者啊至此呢,啊就将这个消息啊发送完毕了,那我们总结一下来看。
05:09
其实很简单,这就是发送的这个逻辑,根据你的事件类型啊,去发送给每一个的订阅者。啊,他第一步干嘛呢。得到要发送的四件类型。啊,那你看一下。回到post。这。呃,这呢,这是具体发送啊,还没有发到这第一步得到你事件的类型啊,发送事件的类型根据它干什么呢?根据事件类型获取所有的订阅者,也就是通过这个方法来获取啊,集合来我们看一下,那么通过它。往下走。这儿啊,再进来。再进来是不是就通过它呀,它过去啊,这个集合中啊,拿着这个事件类型的K,拿到所有的订阅者,那么拿到这个订阅者之后,我就可以循环发送了。
06:09
嗯,就向循环向每个订阅者发送消息,就这么三步的,再总结一下,得到要发送时间类型啊,根据事件类型获取所有的订阅者啊,到这个集合,然后呢,循环向每个订阅者发送啊,就这么简单。这就是这个啊,发送这个类型。的源码。
我来说两句