在编程过程中,当我们想通知其他组件某些事情发生时,我们通常使用观察者模式,在android中我们可以使用eventbus来实现类似的需求,EventBus是一个Android事件发布/订阅框架,通过解耦发布者和订阅者简化 Android 事件传递。它使用简单,并将事件发布和订阅充分解耦,从而使代码更简洁。
EventBus使用
1,
首先android studio项目的build.gradle
dependencies域
里添加依赖:
compile 'org.greenrobot:eventbus:3.0.0'
目前最新版本为3.0.0 相比以前2.4的版本最大变化就是订阅方法名不在固定,新的版本使用了注解订阅方法名,后面会说到。
2,Event事件
首先需要自定义一个需要传递的事件类,当然你也可以不定义这个类,直接传递基本的数据类型,比如String, int等,EventBus 在传递事件时是基于所订阅方法的的参数类型的,当发送某个事件是,所有当前以这个事件为参数的订阅方法都会收到这个事件,并且订阅方法只能有一个事件,所以推荐的做法是自定义一个类。这里我定义一个非常简单的类,如下:
public class EventNum {
private int num;
public EventNum(int num){
this.num = num;
}
public int getNum() {
return num;
}
}
这个类就包含一个int类型,下面我将演示用EventBus传递这个事件。
3,Event事件接收者
要想获得上面我们定义的这个EventNum事件,我们先要有一个事件接收者,首先需要注册接收者,一般在activity或fragment的onCreate方法里进行注册接收者:
//注册
EventBus.getDefault().register(this);
注册的时候我们一般传递当前的这个类,所以这里用this。 有注册当然要记得再不需要接收这个事件时注销接收这个事件,所以一般在ondestroy方法里注销接收者:
EventBus.getDefault().unregister(this);
注册了接收者后,当然要定义一个订阅此事件的方法了,代码如下:
@Subscribe(threadMode = ThreadMode.MAIN)
public void getEventNum(EventNum eventNum){
mNumTextView.setText(eventNum.getNum()+"");
}
在EventBus 3.0.0后订阅方法名可以随意定义,只需要在订阅方法名上加上@Subscribe注解,这里我们还看到了threadMode参数,Subscribe注解共三个参数:
threadMode,sticky,priority;
threadMode 值代表订阅方法执行的线程,可以为下面四个:
POSTING: 默认为这个值,代表订阅方法的执行线程就是post发送事件执行的线程,即如果你在UI线程用post发送事件时,订阅方法就在UI线程中执行,如果在自定义thread中post发送事件时,订阅方法也在此thread执行,注意这种模式是会“阻塞”post发送线程的,post事件后,会执行完所有订阅了此事件的订阅方法,post线程才会继续往下执行,所以使用这种threadMode时,订阅方法不要执行长时间操作,必须尽快返回,避免长时间阻塞Post发送的线程,尤其是当post线程是UI线程时。
MAIN: 订阅方法执行在UI线程中,即若post事件是在UI线程中订阅方法就UI线程中执行,若post事件不在UI线程中,订阅方法也会在UI线程中执行,注意订阅方法不要执行长时间操作,避免阻塞UI线程。
BACKGROUND: 订阅方法执行在后台线程中,即若post事件在UI线程中,但订阅方法会执行在非UI线程中,但若post事件是在非UI线程中,则订阅方法就执行在此线程中,并且会“阻塞”当前的线程,直到所有订阅方法执行完。
ASYNC: 订阅方法执行在其他单独的线程中,不管post事件在什么线程中,订阅方法都在新的其他线程中执行,这样不会阻塞当前post事件的线程。
sticky 粘性,默认为 false , 当发送者用postSticky方法发送一个事件时,此事件会被eventBus发送出去后,还会保存起来,注意这里最后只会保存发送者的最后一个sticky event事件,若后面有订阅者出现,并订阅此sticky事件,将sticky属性设为true, 则这个订阅者会收到前面已经发出去的sticky event事件。所以用这个属性可以实现了类似于android系统自带的startActivityForResult的场景需求。
priority 优先级,默认0,订阅方法接收事件先后的优先级的,值越大,越先接收到订阅的事件。
4, event事件发送者
event事件发送只需一句话就可以搞定:
EventBus.getDefault().post(new EventNum(num));
就像上面这样,你可以在任何地方发送这个事件,当前已经注册了这个EventNum事件的类就能收到这个事件,若是类似于activity或fragment之间传值,你的接收者是在你发送这个事件后才注册的,你就需要使用下面这个方式发送事件:
EventBus.getDefault().postSticky(new EventNum(num));
同时订阅的方法也需要配置Sticky参数,如下:
@Subscribe(threadMode = ThreadMode.MAIN,sticky = true) //这里接收启动它的activity传过来的值
public void getInitEventNum(EventNum eventNum){
num = eventNum.getNum();
mNumTextView.setText(eventNum.getNum()+"");
}
Eventbus 源码解析敬请期待下一章为你详细解读......。
更多精彩Android技术可以关注我的微信公众号,扫一扫下方的二维码或搜索关注公共号:
Android老鸟