从EventBus2.0 到 EventBus3.0

《从EventBus2.0 到 EventBus3.0》 40dcb91772af2cfb64dd9b2c4d0778f8.jpg

前言:

以前开发一直在用 EventBus2.0,最近想学点新东西,看到EventBus竟然出3.0了,看时间是早就有了,但一直没接触过,就学习学习,也顺便谈谈我在使用两个版本时,对它们的不同的感受。
开讲之前先付一下源码地址:https://github.com/greenrobot/EventBus

介绍一下:

EventBus是由大名鼎鼎的greenrobot出品的一个用于Android中事件发布/订阅的库。简单点说就是用于Fragment,Activity,Service,线程之间进行数据传递,它为开发者提供除了 intent、handler、boardcast这几种传递数据的方式之外的一种选择,其优点在于 几乎不怎么消化资源,并且代码优雅简洁。

EventBus 的组成

《从EventBus2.0 到 EventBus3.0》 EventBus-Publish-Subscribe.png

从上图我们可以看到,EventBus 作为事件总线,有3个重要做成部分:

  • Publisher: 发布者。 表示数据的持有者,通过eventbus.post(obj)方法将数据传递出去,然而并不关心数据是否被接受,以及数据的传递过程。获取方法也很简单:
EventBus.getDefault();
  • Event:事件。这里我习惯称之为数据,就是你所要传递出得对象。
  • Subscriber: 订阅者。 或者好理解点的话,可是称之为接收者,数据将通过这些函数来进行接受。EventBus这里提供了四个函数且只能用这四个:onEvent,onEventMainThread,onEventBackgroundThread,onEventAsync .当然,上面的方法是对于EventBus2.0中用到的 下面会重点讲一下3.0的用法。

EventBus 四个Subscriber

首先在将四种方式之前不得不说一下ThreadMode, ThreadMode 是EventBus中一个很重要的概念,其本身是一个enum,他同样提供了四个默认属性值:Async,BackgroundThread,MainThread,PostThread;而在3.0中则改为
ASYNC,BACKGROUND,MAIN,POSTING。分别对应四个方法。

先来说一下2.0中的Subscriber

onEvent
对应 PostThread,当使用onEvent作为订阅函数时,发布者在哪个线程发布事件,onEvent就会在哪个线程接收事件。因为函数执行的线程不确定,这就要求用户 最好不要执行耗时操作,可能会出现线程阻塞或者事件分发不及时的问题。
注意一点:**方法的修饰符 最好 使用 public **

public void onEvent(Object obj){
  
}

** onEventMainThread**
对应 MainThread,当使用onEventMainThread作为订阅函数时,发布者不管在哪个线程发布事件,onEventMainThread都会在主线程接收事件。这就要求用户 一定不要执行耗时操作,不然会造成线程阻塞。

public void onEventMainThread(Object obj){
  
}

** onEventBackground**
对应 BackgroundThread,当使用onEventBackground作为订阅函数时,发布者如果在主线程发布事件,onEventBackground将会新开一个子线程并接收事件,但是如果是在子线程中发布事件,onEventBackground将会直接在该子线程中接受事件。

public void onEventBackground(Object obj){
  
}

** onEventAsync**
对应 Async,当使用onEventAsync作为订阅函数时,发布者无论在哪个线程发布事件,onEventAsync都会新开一个子线程并接收事件。

public void onEventAsync(Object obj){
  
}

而相对来说,3.0 改变对需要固定函数名的设定,提供了一种新的形式,改用注解@Subscribe ,在使用中更加灵活,而且 这里 ThreadMode 将被直接使用。

onEvent 函数的实现

//发布线程中,调用
@Subscribe(threadMode = ThreadMode.POSTING)
public void eventbusPosting(Object object){
}

onEventMainThread 函数的实现

//主线程中,调用
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventbusMain(Object object){
}

onEventBackground 函数的实现

//发布线程为主线程,新开子线程,调用
//发布线程为子线程,该线程调用
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void eventbusBackground(Object object){
}

onEventAsync 函数的实现

//新开子线程调用
@Subscribe(threadMode = ThreadMode.ASYNC)
public void eventbusAsync(Object object){
}

最后说一点:EventBus 并没有摒弃固定函数名的形式,开发者仍旧可以使用这种形式,不过在使用过程中必须要 添加注解 @ Subscribe 但不用指定ThreadMode

EventBus的基本使用

引入

compile 'org.greenrobot:eventbus:3.0.0'

定义事件

public class MessageEvent { /* Additional fields if needed */ }

注册订阅者

EventBus.getDefault().register(this);

发送事件

EventBus.getDefault().post(messageEvent);

接收事件

//eventbus2.0形式
public void onEvent(MessageEvent event){

}
或者
//eventbus3.0形式
@Subscribe(threadMode = ThreadMode.POSTING)
public void postingME(MessageEvent event){

}

注销订阅

EventBus.getDefault().unregister(this);
    原文作者:Liuuuuuuzi
    原文地址: https://www.jianshu.com/p/aed51d6064a9
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞