EventBus依赖库:
implementation 'org.greenrobot:eventbus:3.1.1'
 
 
EventBus主要角色:
  • Event 传递的事件对象
  • Subscriber 事件的订阅者
  • Publisher 事件的发布者
  • ThreadMode 定义函数在何种线程中执行
角色的协作图
 
基本使用:
1. 首先在接收消息的方法中注册EventBUs:
// EventBus.getDefault().register(this);
2. 然后创建方法来接受接收和处理事件:
@Subscribe
public void getEventData(FirstEvent event){}
3. 在onDestry()方法中注销EventBus
EventBus.getDefault().unregister(this);
4. 发送消息
EventBus.getDefault().post(new FirstEvent(“张三”,20));
粘性事件使用:
在注册之前可以使用:EventBus.getDefaule().postSticky(new FirstEvent(“李四”,19));
Sticky=true才可以接收消息.
@Subscribe (Sticky=true)//这个必须存在,不然程序会崩,或接收不到消息
public void getEventData(FirstEvent event){}
获取和删除粘性事件
MessageEvent stickyEvent = EventBus.getDefault().getStickyEvent(MessageEvent.class);
// 判断此粘性事件是否存在
if(stickyEvent != null) {
// 若粘性事件存在,将其删除
EventBus.getDefault().removeStickyEvent(stickyEvent);
}
//取消全部的粘性广播
EventBus.getDefault().removeAllStickyEvents()
 
设置优先级(粘性事件没有优先级)
在EventBus中,观察者也就是Subscription的优先级默认都为0,级别越高,越早收到消息,并且收到消息之后还能阻断后面观察者接收消息,颇有点像有序广播。
注意一下:优先级只是在相同的ThreadMode中才有效,不同的ThreadMode不起作用
@Subscribe(priority = 100)
public void onEvent(MessageEvent event) {
}
 
// 取消分发的事件(只有在POSTING线程在才能取消事件,且只能用于取消非粘性事件)
EventBus.getDefault().cancelEventDelivery(event) ;
 
 
ThreadMode的使用
@Subscribe(threadMode = ThreadMode.MainThread) //在ui线程执行
public void onUserEvent(UserEvent event) { }
 
BackgroundThread和Async区别
BackgroundThread中的任务,一个接着一个去调用,中间使用了一个布尔型变量handlerActive进行的控制。会阻塞线程.也就是说只有一个子线程
Async则会动态控制并发,可能会有多个子线程
(如果任务是耗时任务会影响第二个任务执行得话,Async模式就会再为第二个任务开启新线程,如果第一个任务执行没有影响到第二个任务开始执行,第二个任务开启得线程就有可能刚执行完第一个任务得线程,线程池会复用线程)
 
EventBus3.0要点:
 
1、接受的地方需要注册和解注册
 
2、发送的Bean类自己定义,要传哪些字段也自己在Bean中定义
 
3、EventBus3.0,接受消息的方法自己命名就可以,参数是自己要接受的EventBean,但是必须加注解@subscribe
 
4、同一个类中,保证同一个EventBean只有一个接受方法,不然会接受错乱
 
5、粘性广播,如果 @subscribe (stricky = true ) 把sticky设置成ture ,在你注册的一瞬间就会接收到粘性消息 (注意在注册之前就先把将相关的对象实例化,因为接受是很快的,甚至来不及findviewById,不设置stricky = true的话默认不接受粘性广播);
 
6、EventBus接受消息的地方可以设置ThreadMode;
有四种ThreadMode , 默认情况,和发送事件在同一个线程
 
//主线程中执行
@Subscribe(threadMode = ThreadMode.MainThread)
 
//后台线程 (如果发送线程就是子线程的话,当前线程就是发送线程,如果不是的话,就新建一个子线程)
@Subscribe(threadMode = ThreadMode.BackgroundThread)
 
//强制后台执行 s(每次都是开启新的线程)
@Subscribe(threadMode = ThreadMode.Aync)
 
//默认情况,和发送事件在同一个线程
@Subscribe(threadMode = ThreadMode.PostThread)
 
优缺点:
  1. EventBus是greenrobot公司出的另一款开源框架,这个框架是针对Android优化的发布/订阅事件总线,使用EventBus可以极大的减少我们程序的耦合度。
  2. 调度灵活。不依赖于 Context,使用时无需像广播一样关注 Context 的注入与传递。
  3. 使用简单。
  4. 快速且轻量。
  5. 完全解耦了请求链之间的关系,避免了请求者被长持有,
  6. 比广播更轻量
  7. 可以定义在调用线程、主线程、后台线程、异步。
缺点
  1. 各种Event的定义工作量大。每次传的内容不一样,就需要重新定义一个JavaBean
  2. 3.0之前限定了方法名(3.0已经可以自定义方法名)
 
自拟面试题:
  1. 说说你对EventBus的了解:
以往咱们在Fragment或Activity之间传值的时候,有时候可能用一些静态方法,比较占用内存,容易造成oom,EventBus,它把注册,发送,接收的方法都封装的很简洁,相对于以往的广播,观察者,接口回调等,使用起来更加方便;传送的内容,是根据自定义的JavaBean来生成,需要传什么内容,就在Javabean创建什么属性,使用起来更加方便,随意,实用性很高,而且耦合度很低,不会浪费内存!
 
  1. 说说你对EventBus3.0比2.x和优势
EventBus 2.x 是采用反射的方式对整个注册的类的所有方法进行扫描来完成注册,当然会有性能上的影响。EventBus 3.0中EventBus提供了EventBusAnnotationProcessor注解处理器来在编译期通过读取@Subscribe()注解并解析、处理其中所包含的信息,然后生成java类来保存所有订阅者关于订阅的信息,这样就比在运行时使用反射来获得这些订阅者的信息速度要快
 
//简单使用
//大神深入讲解
//github链接
常见Bug:
粘性事件使用的时候:先寻找控件,然后再注册EventBus接受消息,否则会造成控件空指针有异常.
 
//Logger依赖库:
//compile 'com.orhanobut:logger:1.15'