前言:
以前开发一直在用 EventBus2.0,最近想学点新东西,看到EventBus竟然出3.0了,看时间是早就有了,但一直没接触过,就学习学习,也顺便谈谈我在使用两个版本时,对它们的不同的感受。
开讲之前先付一下源码地址:https://github.com/greenrobot/EventBus
介绍一下:
EventBus是由大名鼎鼎的greenrobot出品的一个用于Android中事件发布/订阅的库。简单点说就是用于Fragment,Activity,Service,线程之间进行数据传递,它为开发者提供除了 intent、handler、boardcast这几种传递数据的方式之外的一种选择,其优点在于 几乎不怎么消化资源,并且代码优雅简洁。
EventBus 的组成
从上图我们可以看到,EventBus 作为事件总线,有3个重要做成部分:
- Publisher: 发布者。 表示数据的持有者,通过eventbus.post(obj)方法将数据传递出去,然而并不关心数据是否被接受,以及数据的传递过程。获取方法也很简单:1234567891011121314EventBus.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){
}
public void onEventMainThread(Object obj){
}
public void onEventBackground(Object obj){
}
public void onEventAsync(Object obj){
}
//发布线程中,调用
@Subscribe(threadMode = ThreadMode.POSTING)
public void eventbusPosting(Object object){
}
//主线程中,调用
@Subscribe(threadMode = ThreadMode.MAIN)
public void eventbusMain(Object object){
}
//发布线程为主线程,新开子线程,调用
//发布线程为子线程,该线程调用
@Subscribe(threadMode = ThreadMode.BACKGROUND)
public void eventbusBackground(Object object){
}
//新开子线程调用
@Subscribe(threadMode = ThreadMode.ASYNC)
public void eventbusAsync(Object object){
}
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);
```