使用eventbus有一段时间了,一直没有总结一下,最近工作有点空闲,决定抽空好好总结一下。
一般在activity的oncreat()中注册:
EventBus.getDefault().register(this);
然后在activity的onDestory()中解除注册:
EventBus.getDefault().unregister(this);
这个方法和之前得版本一样,但是,在3.0中,不再有registerSticky()方法
同时,3.0的register方法没有任何重载,不在通过某个特定的名称来接收某个特定的类
例如,在3.0之前可以这么register
EventBus.getDefault().register(this,"getSomeEvent",SomenEvent.class);
但是在3.0之后这些方法通通都被摒弃了,只有一个注册方法。
与之前版本一样,3.0发送Event的方法没有发生改变,同样是通过:
EventBus.getDefault().post(new SomeEvent());
EventBus.getDefault().postSticky(new SomeEvent()); 来发送不同类型的event。
但是,在接收的方法上,3.0有很大的区别。
3.0是通过注解来接收不同的event事件,同时,在接收事件的方法上,不再需要使用onEvent作为方法名.
例如,一个接收event的方法可以这么写:
@Subscribe()
public void getSomeEvent(SomeEvent event) { `
//do something
}
一个作为接收event的方法,必须使用@Subscribe注解
同时,@Subscribe有三个参数,来配置接收方法
第一个参数: threadMode
threadMode,有4个值:
ThreadMode.POSTING //发布事件所在线程,默认参数
ThreadMode.MAIN //androidUI线程
ThreadMode.BACKGROUND //后台线程
ThreadMode.ASYNC //后台线程
ThreadMode.BACKGROUND 和 ThreadMode.ASYNC 都是在后台线程执行的,但有所区别。
使用ThreadMode.BACKGROUND 的话,如果发布线程是在主线程,那么接收线程会切换到后台线程。
如果不是在主线程的话,会在同一个线程处理。
使用ThreadMode.ASYNC的话,接收线程会强制切换成后台线程,并且和发送线程与主线程总是不在同一个线程上。
第二个参数 : sticky
sticky
true
false //默认参数
sticky用来接收一个最近的标志位sticky的事件,在发送事件的时候,需要使用
EventBus.getDefault().postSticky(new SomeEvent());
这里有一个小技巧,一个activityA给另一个activityB发送事件,如果B是第一次启动,那么使用post是收不到A发送的event的,这种情况下可以使用postSticky来发送。
同时,由于使用sticky的话event会一直保存最后一个,如果想解除保存的话,可以使用:
EventBus.getDefault().removeStickyEvent(Evn.class);
第三个参数:priority
priority //默认值0
priority 用来标志接收方法的优先级,如果多个方法对同一个event进行处理,需要按不同的顺序来处理的话,可以使用这个参数,值越大,优先级越大,越先处理事件
综上所述,那么一个完整的EventBus分发事件那么会经过以下步骤
接收类: 注册-->注解接收方法->取消注册
对应方法:
register()-> @Subscribe注解的方法->unregister()
分发事件类: 注册——>发送事件->取消注册
对应方法:
register()-> post()/postSticky()->unregister()
以上,另外写了一个demo,方便大家更好的理解,点击下载
另,有兴趣的可以关注下,开始会每周不定期更新博客,基本上都是一些自己的经验,心得。
所有demo都会上传到github.