EventBus3.0源码分析

本文详细分析了EventBus3.0的源码,包括基本使用方式、订阅(注册、订阅、解除注册)、发送事件(普通事件、粘性事件)的流程。讲解了threadMode、sticky和priority等关键参数的作用,并强调了解除注册和粘性事件管理的重要性。
摘要由CSDN通过智能技术生成

EventBus3.0源码分析

基本使用方式:

1、build中依赖,直接使用
implementation 'org.greenrobot:eventbus:3.0.0'

2、在需要接收事件的Fragment或者Activity或者View中注册,并且加入订阅方法,在onDestroy中进行解除注册

EventBus.getDefault().register(this);

@Subscribe(threadMode = ThreadMode.MAIN)
public void onMessageString(String s) {
//接收到事件
}

@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(this);
}

3、发送事件
EventBus.getDefault().post("post message");

上面是基本的用法,EventBus有两个要素,发送、订阅,先说订阅,因为你不订阅,事件发送出去也没地方接收

前言
我们先明确两件事件(我自己的归类):
订阅包含(注册、订阅、解除注册)
发送包含(发送普通事件,发送粘性事件,取消事件)

订阅

1、注册
EventBus有两种方式获取实例:
第一种通过EventBusBuilder的build去注册,这种方式可以自己去配置一些自己想要的属性
EventBusBuilder builder = EventBus.builder();
builder.build().register(this);
image.png

第二种直接采用默认配置
EventBus.getDefault().register(this);

register方法中,通过调用subscriberMethodFinder的findSubscriberMethods(subscriberClass)方法去查询出该订阅对象中所有的订阅方法(订阅方法就是带有@Subscribe注解的),并且将所有的订阅方法注册到EventBus中
image.png

2、订阅(Subscribe)
在注册的时候提到了一点,findSubscriberMethods(subscriberClass)方法会查询出所有的订阅方法,并注册到EventBus中去,这里的订阅要满足四个条件,Subscribe注解、public修饰、void返回、单参数

image.png

上面是Subscribe的注解类,我们可以看到里面有三个参数
2.1、threadMode:总共有五种mode

  • POSTING(默认):和发送事件处在同一线程中,因为他和发送事件处在同一线程,避免了线程切换,所以是开销最小的。使用此模式不要在主线程中发送事件,避免线程阻塞
  • MAIN:处于主线程中接收事件,别处理耗时操作,会阻塞
  • MAIN_ORDERED:处于主线程中接收事件,与MAIN不同,事件接收将始终等待传递(这是后期才出的模式)
  • BACKGROUND:如果发送事件在主线程,接收事件方法在后台调用,后台线程将依次交付事件;如果发送事件不是在主线程,则接收事件处于和发送事件同一个线程
  • ASYNC:接收事件处于一个独立的线程,EventBus使用线程池,重复利用已完成了异步订阅的线程

2.2、sticky:是否发送粘性事件,默认为false,粘性事件就是先发送,等到订阅者订阅后再接收事件
场景:请求到了数据,但是界面还没有完全初始化完成,那个时候还没有订阅者出现,这时候就需要用到粘性事件,先将事件发出去,等到订阅者出现后,再接收数据。

为了节省开销(postSticky的时候会将事件存进对象中去,不销毁会占着内存位置),发送粘性事件的时候记得一定要在订阅方法结束时使用removeStickyEvent回收掉这个粘性事件

2.3、priority:设置优先级的,相同的Mode下,优先级高的会比优先级低的更先接收到事件,默认为0

3、解除注册
** **解除注册的时候将从该订阅者中取出所有的订阅方法get(subscriber),然后从该订阅者中解除订阅(unsubscribeByEventType(subscriber, eventType)),全部订阅方法都解除了后,将该订阅者从EventBus中移除(remove(subscriber))
image.png

发送

1、发送普通事件
使用EventBus.getDefault().post(“post message”);来发送普通事件,
2、发送粘性事件
使用EventBus.getDefault().postSticky(“post message”);来发送粘性事件,粘性事件在订阅部分中提过了
image.png
粘性事件也是走post方法,post方法中会去遍历队列,执行postFin gleEvent方法,并且遍历一次就将队首remove掉,直到队列为空
image.png
postSingleEvent:根据event(这个就是订阅方法中的那个接收的参数)去查询出所有的订阅方法,然后调用每个订阅方法

这里建议每个订阅方法的参数都是一个实体类,别用通用类型的参数,比如String这种,不然发送的时候会给一些不需要的订阅方法传递参数

image.png

image.png
根据不同的线程模式,去调用相应的方法
image.png

EventBus的发送、接收流程大致就是这样

收!

参考链接:
感谢!感谢!感谢!
https://www.jianshu.com/p/1eaca34e5314
https://www.jianshu.com/p/92a4b2a5abc6

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值