EventBus 3.0 的使用

首先强调:
/**

     * 注册一定要放在控件初始化方法之后,使用postSticky的时候,什么时候注册,就什么时候接受数据,所以接收数据之前需要调用的方法要放在注册语句之前

     */

首先要注册:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
EventBus.getDefault().register(this);
}

@Override
protected void onDestroy() {
    super.onDestroy();
    EventBus.getDefault().unregister(this);
}

然后在发数据的地方:
Bean b = newBean();
EventBus.getDefault().post(b);
搞定

注意
1、post 发布事件
此处要注意两个地方:

如果 post 字节数据,此时订阅者的方法里参数需为 Byte,而不是 byte,同样的,post int数据,订阅方法参数需为 Interger,其他基本数据类型同理

如果 post 字符串,那么所有方法的参数是 String 类型的订阅者都会接收到事件而执行方法。

2、订阅者接收事件
订阅的时候要注册和取消注册。

注册一般是在 onCreate 和 onStart 里注册,尽量不要在 onResume,可能出现多次注册的情况,比如下面这个异常::

EventBusException: Subscriber class already registered to event class
可以先判断下:

if (!EventBus.getDefault().isRegistered(this)) {
    EventBus.getDefault().register(this);
}

取消注册 要写到 onDestroy 方法里,不要写到 onStop 里,有时会出现异常
EventBus 3 采用注解后,方法名没有限制了,参数只有一个,和发送者 post 的参数对应配对,在未声明 threadMode 时,默认的线程模式为 ThreadMode.POSTING,只有在该模式下才可以取消线程,否则容易导致如下异常:

org.greenrobot.eventbus.EventBusException: This method may only be called from inside event handling methods on the posting thread
由于可在任何地方都可以 post 一个事件,那么在不同线程之间传递事件,比如在工作线程传递一个事件更新UI线程中的一个控件,则需要注意 threadMode 的切换。

3、
今天遇到了订阅事件无法执行的情况,原因:我在activity里面post,但是注册的地方士fragment,post的时候fragment还未创建,所以,接收不到,需要用延时操作。

找到原因就好办了,这时候就需要用到 postSticky。

发布事件时用 postSticky 操作:

EventBus.getDefault().postSticky(event);
订阅时,添加 sticky = true

@Subscribe(sticky = true) //看下 @Subscribe 源码知道 sticky 默认是 false
public void onEvent(Event e) {

}
这里也有个坑,就是 EventBus.getDefault().register(this); 注册时最好放到各变量初始化最后,否则可能会出现一些变量空指针异常

在一个activity中俩个方法:
//接受值
@Subscribe(threadMode = ThreadMode.POSTING)
public void getInfo(SearchTagsBean bean){
Log.e(“asd”,bean.getName());
}
//一些点击事件
private void someThingListener() {
//向另一个activity传值
mBack.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
EventBus.getDefault().postSticky(query);
}
});
}
这个时候你会惊喜的发现,可以接受到值,也可以传值,但是当你传值的时候不光那个activity中的方法接收到了值,发送消息的activity中的接受方法也接受到了值,这可如何是好?
我是通过传的值的类型不同来解决的,比如一个传string,一个传实体类,这样就不会发生穿线的情况啦

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值