EventBus 遇到的问题汇总
一、EventBus 粘性事件接收不到的问题
1、起因
由于EventBus发送的是对象,我们经常构建一个共用的对象,在共用对象中添加tag,用于方便在接收中区分作用。
例如用EventBusHelper工具类发送EventBusMessage对象。
2、遇到的问题
在发送粘性事件时,在A场景发送了一次,然后还没有接收,然后在B场景又发送了一次,这时B发送的粘性事件可以收到,而A场景的粘性事件被替换掉了。
这时因为在EventBus的源码中,粘性事件使用Map集合存储,key为 object.getClass(), 当我们自定义EventBusMessage的时候,导致object.getClass()一直是相同的,以至于会替换前一次的key。
public void postSticky(Object event) {
synchronized (stickyEvents) {
stickyEvents.put(event.getClass(), event);
}
// Should be posted after it is putted, in case the subscriber wants to remove immediately
post(event);
}
3、解决方法
创造多个单独的对象,用于发送粘性服务。
上面的方法比较Low,还没有想到比较优雅的方法,有的话分享出来吧。
二、Post/postSticky 不能传递基本类型。
eg: 使用post/postSticky直接传递,在Subscribe处接收int,此时收不到消息。 将int tag改为 Integer tag 就能收到。
这时因为EventBus中要求传递的为Object,Object属于类类型,也就是复合数据类型,int属于简单数据类型。
EventBus.getDefault().post(111);
@Subscribe(threadMode = ThreadMode.MAIN)
public void getMessage(int tag) {
if (tag == 111)
Log.d(TAG, "received");
}