Android EventBus 3.0 使用及源码解析一


在编程过程中,当我们想通知其他组件某些事情发生时,我们通常使用观察者模式,在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 就这么使用方便简单,短短的几句代码就能让你的代码看起来简洁漂亮,少了各种繁琐的回调等复杂的代码来实现通信,所以赶紧用起来吧,让你的代码变成小清新。

Eventbus 源码解析敬请期待下一章为你详细解读......。


更多精彩Android技术可以关注我的微信公众号,扫一扫下方的二维码或搜索关注公共号: Android老鸟

                                                








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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值